用户
搜索
  • TA的每日心情
    开心
    4 天前
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    i春秋-脚本小子

    Rank: 2

    6

    主题

    6

    帖子

    111

    魔法币
    收听
    0
    粉丝
    0
    注册时间
    2021-6-6
    发表于 2021-8-13 12:37:31 02411

    代码审计----sql注入篇

    代码审计---文件上传篇
    本篇文章作者yggcwhat,本篇文章参与i春秋作家连载计划所属从0到1团队,未经许可禁止转载。连载方向:web安全,内网安全。
    目录
    反序列化漏洞分析篇
    1-----------反序列化漏洞分析
    2-----------session反序列漏洞分析
    PHP代码审计篇
    1-----------文件上传
    2-----------SQL注入
    3-----------xss+文件上传

    说在前面

    次审计纯属分享审计过程和审计思路,请勿用于非法用途!

    审计过程

    拿到源码,我们可以本地搭建,进入后台看看有什么可能存在漏洞功能块。

    我们可以看到里面有一些功能,里面有一个sql的写入框,有问题看看有没有过滤,我们随便输入东西看一看

    看来存在过滤

    但是我们有源码不怕,通过报错信息里有一个非法操作,放到工具里面源码审计系统搜搜看

    发现里面1到17个都有感叹号,说明这个程序运行是在最后一个里面,发现后面两个都是在同一个php文件里面,我们先看第一个

    后来发现最后面两个搜索结果都是同一个地方,可能是搜索结果出现问题了

    回到正题,通过这个搜索我们还不能判断是否程序运行在这里,我们再看看里面的参数有title,limits,orders,isall,sqls等等,他们都是通过frparam函数将这些参数里面的具体内容传递给$data这个数组里面,既然是参数可以肯定在抓包的时候会出现,我们就抓个包试试

    在前面那个功能块里面点击保存,并抓包


    我们可以看到里面的参数和我们源码里面看到的参数一样且sql的输入框框是sqls这个参数,基本可以肯定是这里了

    接下来就是代码审计了

    我们可以看到他做了一个if判断,通过frparam函数的运行结果是否等于1,我们看看frparam函数,这个函数一看就是自定义的,对于自定义的函数肯定有function frparam这个函数声明,我们去搜一搜。

    找到了,点进去看看

    可以看到它是获取URl的参数值,通过前面调用这个函数,他已经go和1传过来了,所以这里的$str和$int为go和1。

    这里$data = $this->_data;意思是把前端的所有数据传过来,这时候再判断$str是否为空,再通过这个array_key_exists函数判断$str是否在不在$data里面,显然都不满足,所以跳过,后面他在$method变量判断,显然是为空的,因为我们没有赋值给他就默认了,然后把 $data[$str]赋值给$value了,最后再return format_param($value,$int,$default);看一看format_param函数。


    这里他参数过滤,格式化了,通过前面传来的int=1,我们直接跳到case 1:,里面他通过SafeFilter函数进行了过滤,我们定位看看


    可以看到他里面过滤了xss攻击了,简单看了一下,是过滤xss的,顺便看下这个框框有没有xss漏洞,通过 $arr = preg_replace($ra,'',$arr)这个函数判断$arr有没有在$ra里面,有就替换成空了,看到$ra里面就过滤了一些基本的js语句,可能会有,然后再接着看下去,就回到前面了。

    可以看到他又把传来的$值给html实体了。。。没戏。

    不慌,我们接着看下去。

    可以看到他判断php版本了,大于等于7.4就会通过addslashes函数在每个双引号"前添加反斜杠,然后再return $value,如果没有大于等于,就会判断是否开启魔术方法了,没有就会和上面一样,通过addslashes函数在每个双引号"前添加反斜杠,然后再return $value,说到这我只能说这代码写的真严谨。。。

    好了,这里看完了,回到前面。

    这里return的值就是层层过滤后的$value的值了,这里运行结束,然后我们再返回去看前面。

    好了,一个frparam函数终于看完了,后面好多个都是通过这个frparam层层筛选的和前面一样,就不多说,我们再往下看。


    (太长了,截两张)这里他对这个sqls参数进行了stripos函数判断,这个stripos函数是查找我们指定的字符在字符串中第一次出现的位置,如果有就会输出位置也就是不等于false,也就是为真了,代码里他通过多次或逻辑,只要有一个为真就会执行if里面的”非法操作“这个代码,所以我们只要绕过这些判断,也就是全为假,可以看到他对update,delete,insert,drop,truncate进行了对比,我们只要不适用这些函数就OK了。

    看到我箭头画的就是执行顺序了,他直接就带入执行了,说明存在漏洞。

    漏洞验证

    我们只要的插入sql语句的时候不要有上的敏感字符就可以了,payload我相信大家都会写,我就不废话了,就直接放sqlmap跑了。

    发新帖
    您需要登录后才可以回帖 登录 | 立即注册