基于本地搭建的phpMyAdmin和sql-labs来对sql进一步学习
1、如何判断是字符型注入还是数字型注入
方法一:
字符型:提交and 1=1和提交 and1=2有回显(提交and 1=2时如果是字符型注入,则不能将1=2解析,就会默认为是对的,从而回显id=id的值;
如:在less-1中输入
?id=2 and 1=2
可以看到还是返回了id=2的信息,说明1=2这个条件没有被当作数字来解释,从而可以判断less-1是字符型注入
数字型:提交and 1=1和提交 and1=2没有回显
如:在less-2中输入
?id=2 and 1=2
可以看到没有任何回显,这是因为将1=2解释为数字,这个条件本身是错误的,不能进行正确的回显,于是返回值为空
方法二:通过减法来判断
id=2-1
如果是数字型注入,则结果是2-1的结果
如果是字符型注入,字符不能进行运算,则会输出id=2的结果
同样分别在less-1和less-2中输入
?id=2-1
对于less-1:
其返回值为id=2的结果,可见其为字符型注入,与上面的判断结果一致
对于less-2:
返回值为less-1的结果,说明为数字型注入
利用phpMyadmin也可以查询到该数据库的具体内容:
2、关于闭合符
字符型需要闭合符,如下:
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"
提交 1 and 1=1
$sql="SELECT * FROM users WHERE id='1 and 1=1' LIMIT 0,1"
id传入的1 and 1=1被引号包围,不能当作命令来执行
数字型则不需要闭合符来闭合:
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1"
提交 and 1=2
$sql="SELECT * FROM users WHERE id=$id and 1=2 LIMIT 0,1"
输入的内容能被当作命令来执行
字符型常见闭合方式:
闭合方式: ' " ') ")
注释符:
--+ # %23
利用注释符暂时将某段程序脱离运行,让他暂时不运行
3、union联合注入
如在less-1中,尝试进行union联合注入,结果显示行数不匹配
这是因为不知道到底有前面有多少列,我们注入的列数应该与前面的列数相同才不会报错,有两个命令可以用来查询,在union命令查询前,需要先判断前面的列数是多少
group by + 要查询的列数(不易被防火墙发现)
order by + 要查询的列数
如在less-1中,查询group by 10,结果显示
说明无法找到第十的列名,即没有第十列,我们逐步缩小范围,可以看到,当查询到4时依旧报错,但是查询到3时有正常的回显,即可得到,前面查询的列数为3
得到了三列,尝试查询:?id=1' union select 1,2,3--+
结果显示:
可以看到页面并没有改变,这是因为我们的命令有两行显示,第一行应显示id=1的结果,第二行显示联合查询union select 1,2,3的结果,但是我们的页面只能显示一行的结果。
如果要想页面显示联合查询的结果,那么就让第一行的显示结果不存在,即可输出第二行的显示结果。我们尝试将id改为0或者-1,可得:
就可以看到我们的回显位了,即2和3都可以回显,我们尝试查询3的回显,在3的位置上修改为database(),即可看到在password上面显示了3的回显:security
同理2也可用来显示,如我们在2的位置查询php的版本,修改为:version(),也可得到回显
回显出来php的版本为5.7.26
但是1就没有回显,那是因为回显位只有2和3,1不能回显
4、小结:注入的顺序
(1)查找注入点
(2)判断是字符型注入还是数字型注入 and 1=1 1=2/ 3-1
(3)如果是字符型,要找到他的闭合方式 ' " ') ")
(4)查询列数,group by order by
(5)查询回显位置,将id改为0或者-1
5、
查询语句:
select 列名 +from表名 +where限定语句
拿到表名和列名:
表名集合表:tables
列名集合表:columns
所需要的表名信息:数据库information_schema——>数据表tables——>数据列table_name