题目源码:
<?php
if (isset($_GET['cmd'])) {
$cmd = $_GET['cmd'];
if (!preg_match('/flag/i',$cmd))
{
$cmd = escapeshellarg($cmd);
system('cat ' . $cmd);
}
} else {
highlight_file(__FILE__);
}
?>
知识点:
1.绕过正则
2.escapeshellarg函数绕过
3.熟悉常见web中间件日志文件存放位置
解题过程:
1.了解代码流程
(1)我们需要通过get方式传入cmd参数。
(2)正则的if语句判断。
判断条件:传入的cmd参数中是否包含flag/FLAG/字样
判断成功:传入的cmd参数中不包含flag/FLAG/字样,并执行如下代码。
{
$cmd = escapeshellarg($cmd);
system('cat ' . $cmd);
}
其中cmd参数会通过escapeshellarg函数处理后再通过system函数执行cat $cmd命令
判断不成功:传入的cmd参数中包含flag/FLAG/字样,并执行如下代码。
{
highlight_file(__FILE__);
}
2.解题思路:
我们要通过查看日志文件来找到flag文件名称,并且需要绕过正则和escapeshellarg函数来最终达到执行cat命令拿到flag。
3.具体绕过姿势
(1)首先百度查询并通过测试发现日志文件为/var/log/nginx/access.log?
payload1:?cmd=/var/log/nginx/access.log
利用cat命令查看日志发现baohanflag的文件名this_is_final_flag_e2a457126032b42d.php
(2)绕过正则和escapeshellarg函数:
因为escapeshellarg函数会忽略ASCII码大于127的字符,所以我们找一个ASCII码大于127的字符嵌在'flag'中,这样既可以绕过正则又可以绕过escapeshellarg函数,一举两得,这里找一个字符例如%af,%df,%ae绕过即可。
payload:?cmd=this_is_final_fla%aeg_e2a457126032b42d.php
?
总结:
1.常见日志文件存放位置
Nginx:
访问日志文件:
/var/log/nginx/access.log
/usr/local/nginx/logs/access.log
错误日志:
/var/log/nginx/error.log
/usr/local/nginx/logs/error.log
Apache:
访问日志:
/var/log/apache/access.log
/usr/local/apache/logs/access_log
错误日志:
/var/log/apache/error_log
/usr/local/apache/logs/error_log
Tomcat:
/var/tomcat/logs
/usr/local/tomcat/logs/catalina.out
更多日志目录及介绍
https://blog.csdn.net/qq_41814777/article/details/106883265
2.escapeshellarg函数绕过
选择一个ASCII码大于127的字符
例如:%df、%ae、%af等
|