加一个题: 攻防世界web之ics-05
也是这个preg_replace
一、不足:
- 在文件包含那里卡住了,想着flag.php还是next.php10多分钟后才想到可以用filter协议来读么,,,等一会看看能不能用data协议来读去???
这个可以的:index.php?text=data://text/plain,I have a dream&file=php://filter/convert.base64-encode/resource=next.php - 看到正则+str_replace,+ e 修正符,想到的是RCE!?!!。
- 知识点:/e模式的preg_replace,有一个远程代码执行漏洞
二、知识点:
- 点这个:深入研究preg_replace与代码执行。讲真,里面的一些python的小脚本可以学习学习呦
- 看这个我自己吸收了一波之后的:正则中\1的用法—反向引用
- 那个可变变量的花括号,就像是C语言中的小括号一样,明确变量名字的,没有什么实际意义的
- 真就直接就执行了呗,(这里去掉花括号不行!!!不行!!!!)这个是给 第一点 实验用的。那个第一点中的 爬坑三 有详细解释。讲的很棒的,既然这个 ${phpinfo()} 能传,
- 这个 ** \S=${getFlag()} ** 的意思就是执行代码的意思了,我看了,大牛写的博客中也没有说为什么使执行代码,只是讲了怎么构造使之执行代码,。一样的 换成phpinfo()一样执行

三、做完题,看完博客后的 要求:
-
这个套路要会用,看到这个 preg_replace 和 /e 的组合运用的时候,要能够想到使这个代码执行来
然后 -
正则的反向代理\1得会,
-
还有PHP得 可变变量 也要弄得明明白白的!
四、我的思路:没有做出来,,,
php://input 一下子想到了,但是这个文件包含的还是慢了点,这个php://input换成data伪协议也可以做的
这个可以的:index.php?text=data://text/plain,I have a dream&file=php://filter/convert.base64-encode/resource=next.php

解码后这样://注释是我自己加的
<?php
$id = $_GET['id'];
$_SESSION['id'] = $id;
/*总体作用好像,就是全部换成小写。。*/
function complex($re, $str) {
return preg_replace(//i 是大小写,e是配合preg_replace使用的
'/(' . $re . ')/ei',//把匹配来的字符串当作正则表达式执行
'strtolower("\\1")',
$str
);
}
foreach($_GET as $re => $str) {
echo complex($re, $str). "\n";
}
function getFlag(){
@eval($_GET['cmd']);
}

system给我整的没有回显了,,,,
然后里面有个session_id没有用上
所以我这里的思路有两个
- 包含session文件,getshell
- 用一个有会显的系统命令试一试。
这里的思路好像就不对了,但是做其他的提的时候可能有用哦。那个无回显的RCE看看我的那个ctfshow的博客,
不怎么好使之后,我就看WP了,,,,
差这最后一步,,
五、真WP
思路是利用这个代码执行,执行源码中的getFlag()函数,在传入cmd参数,再利用getFlag中的eval()函数,再进行一个代码执行。
问题来了:
他这个虽然定义了function,但是没有执行这个函数,我们要做的就是要使这个函数执行,然后传入执行的变量参数
然后payload:next.php?\S*=${getFlag()}&cmd=system('cat /flag');。这个 \S*=${getFlag()} 的意思就是执行代码的意思了,我看了,大牛写的博客中也没有说为什么使执行代码,只是讲了怎么构造使之执行代码,。一样的 换成phpinfo()一样执行,所以刚才说了。
我们要执行getFlag()方法(函数)的eval,那就执行啊,所以就套用格式,将phpinfo()换成了getFlag了,
然后就执行了这个函数了,就正常的命令执行, cmd = system(‘cat / flag’) 就好了
这个套路要会用,看到这个 preg_replace 和 /e 的组合运用的时候,要能够想到使这个代码执行来
然后
正则的反向代理\1得会,
还有PHP得 可变变量 也要弄得明明白白的!
六、攻防世界web之ics-05的一些不足与收获
- 还是老样子,以前是在源码中,看到include,file_get_content不够敏感,不能够第一时间反映出来是 文件包含漏洞来 。这次在url上面,也没有足够的敏感度。
- 阅读源码不够仔细,明明提交page参数的时候, 后面有die()这个函数,我却没看到,以后阅读源码的时候要细心。
- LFI黑盒判断的方法:
从URL上看,URL中的 path , dir , file ,page, pag ,archibe, p ,eng ,等和文件,网页,下载相关的关键字眼的时候,都可能存在文件包含漏洞,
看这个
知道/e能够任意执行代码就好,相当于eval。这个没事多看看,,
preg_replace($pattern, $replacement, $subject);
这个自己构造的时候,pattern中一定要有/e,然后subject中能够和pattern中匹配,最简单的是subject=abc,pattern=/ab/e 。 然后replacement就是随意的代码执行了
preg_replace('/('. $regex.')/ei','strtolower("\1")',$value)
这个的模式是固定的。
串入 get参数 /\S*/e 。这个正则,就是不是空白字符任意多个匹配,然后 value 就是我们的任意命令了。
文章多看看就明白了

本文介绍了BJDCTF2020和攻防世界web之ics-05中的preg_replace漏洞利用,重点讨论了/e修正符导致的RCE问题。讲解了如何通过正则表达式和可变变量实现代码执行,强调了了解此漏洞及正则反向引用、PHP可变变量的重要性和应用。

2052

被折叠的 条评论
为什么被折叠?



