热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

sql盲注如何修补_某团购CMS的SQL注入漏洞代码审计

作者:会上树的猪合天智汇0x00SQL注入漏洞:简单介绍一下SQL语句:通俗来理解就是开发者盲目相信用户,没有严格检查用户输
3666eb30b1c5960d8c85833d6a8351d1.png

作者:会上树的猪 合天智汇

0x00 SQL注入漏洞:

简单介绍一下SQL语句:通俗来理解就是开发者盲目相信用户,没有严格检查用户输入,导致用户可以输入恶意参数进入程序逻辑,最终拼接恶意参数改变原本的SQL语句逻辑,造成SQL注入漏洞。

0x01 关于CMS

本次审计的CMS是基于Web应用的B/S架构的团购网站建设解决方案的建站系统,它可以让用户高效、快速、低成本的构建个性化、专业化、强大功能的团购网站,采用PHP和MYSQL数据库开发技术,版本CV1.6。商业案例如下:

579209e9b131438234264ac61d1095b6.png

审计结果实战测试:

1c69b4c8ce9e0498cdb69a3ba4bd4098.png

0x02 漏洞分析:

首先在本地搭建一个网站,方便之后测试,一键安装也没啥说的,跳过。重点讲讲这个团购CMS的SQL操作。这个团购CMS将SQL操作全部写到了include/library/DB.class.php文件:

278ab68d1a24e7a35d9e1702aa5cf01d.png

然后分析这个文件,发现这里面的函数有些使用了:mysql_real_escape_string函数对参数进行过滤,整数参数就强制转换int类型

5788d7a40702c142cc73f9ba08da5561.png

关于mysql_real_escape_string函数的注入可以尝试宽字节注入,当数据库编码采用GBK的时候可以尝试bypass函数检查,但是此处不适用。之后审计发现其中存在几个未对参数进行过滤直接执行SQL语句的函数:GetDbRowById、GetQueryResult、GetField。

78f412a8f938c2b79a90e5c769014185.png
71253dab05374916453c34b3cc06df0c.png
3fb79320e271b19d0e46937ae6e0e366.png

此处采用敏感函数回溯的方法进行审计,先全局搜索这些函数,然后想办法对达到触发条件。

  1. 全局搜索GetField函数,发现没有被引用的地方。
cb063fb284a824dc71cfd724d625e543.png

2、全局搜索GetQueryResult函数,搜索结果比较多,如下:

9004d50b5eeb73636bbe73a20078c39f.png

先尝试审计第一处:/ajax/manage.php,如下,如果存在,可以通过$id变量进行注入。

dbd1b8b610187194d6b08297cabca172.png

追踪如何触发函数:第490行,当变量action满足条件即可:

1c3c02eed4bc71e3a95cad75d9ba03d9.png

而继续回溯,$action的来源$_GET:

c4be0905cc83af2831fe706fe09a63c3.png

同时也发现id变量被强制类型转换了,哦豁,这下安逸了,这个点基本利用不了了。同时测试过程中此处还有一处调用了未过滤SQL函数:

ea61aef84c292bc45e30c652011d622b.png
8dee3a018b820981127b9b19c6b19984.png

不过都用到了ID参数进行注入,所以不能利用,放弃。

之后选择其他可能存在的地方继续审计:/manage/user/index.php

5fb726193adde95a51c073a5996db371.png
011fe6b266ed4fb95fa4708a662ae764.png

但是这两处同样存在intval参数过滤。

9640ae058e7c81967611bc9215107d14.png

再继续搜索,发现/manage/vote/feedback.php

77036c7b640233741ca3c67903bcb745.png

此处$question[‘id’]参数来源于前一个查询结果,可以考虑二次注入,不过此处因为id参数为提交问卷时系统自动生成,所以无法利用了。

44c1e8b8e6a80b7f4d8bc0f23eae7cf4.png

最后两处调用这个函数的地方在DB.class.php中:其中一个属于LimitQuery函数调用,因为存在过滤,所以利用比较困难:

6df1d6b049d62b71cf24a9ce4ecc5bc8.png

另外一处便是GetDbRowById调用,此处不存在过滤,可能存在注入,这个审计便放到下一部分:

244fdf8fa833a76196810229ff97a1dd.png
  1. 全局搜索GetDbRowById函数:根据之前的审计,函数本身没有对参数过滤,其中调用的GetQueryResult函数也没有过滤,可能存在SQL注入。
883629b196214ee2416b76ef89881bc0.png

可以发现GetDbRowById函数在include/library/Table.class.php文件存在调用:_Fetch函数和FetchForce函数

b2d7d08c169693d8b9dbc80bab623af1.png
1d0213f7ef66e43f651d2c1e6877a121.png
003e9375c9f58e4d44df9c78cbd6c84f.png

其中_Fetch函数在同类中的Fetch方法被调用:

830fd4d6e8a0b1b08d1e6c72bd02fc54.png

因此需要全局搜索Fetch函数和FetchForce函数:

首先来搜索FetchForce函数,结果如下,还挺多的

5c1118c83a3dc89be5f06a8095dfa5bd.png

首先要说的就是搜索的结果不一定全部存在注入,需要再次寻找其中疏于过滤的点进行验证,下面举几个栗子:

文件:/ajax/chargecard.php

ce3d7eda46c9c4ed3c038ce84c828597.png

不需要登录便可以直接访问这个文件,当$action为query时可以调用函数,且$secret不存在过滤,开启debug调试跟踪参数的流程:先输入secret=123’

可以看到对secret参数没有进行任何过滤便传入FetchForce函数:

d0c34b0e19f70c5eed90f305e1b20623.png

将存在恶意字符的参数拼接SQL语句,造成SQL注入,因为此处存在对空格等字符的正则匹配,所以可以使用/**/代替空格。

90def401fcdf255c99bbe2f0438851e8.png

因为此处不存在回显,要使用盲注,使用时间盲注验证,一个用时2秒,一个用时5秒

ace52b2afcd1cfe8ad054f80ed146f8e.png
9d1189996b43d46fb135a53e786b662f.png

而且同文件下存在另外一处注入:

932b422bebc1cdd80f1f01b6f38a24c6.png

这个地方用方法也差不多,就改一下action参数便可以。

再举一个不存在注入的情况:/ajax/manage.php

890ddc3a7dbf4f9c25541067dbf92693.png
5377fab73c2579043b692004dcfbb9bf.png

虽然调用了FetchForce函数,但是溯源之后发现对id变量进行了强制转换,因此属于不能利用的点。与此同时new.php也属于同理情况:

13058b4acbdc827addac5dbf8bf73d79.png

同时如果继续搜索审计就能发现其他存在注入的点:

6f60950a36547e23e290318b75873edc.png

其余的文件就不一一看了。

接下来查看Fetch函数:搜索结果如下

2942bd0466d9d1441e0cb789cdf5202c.png

先来看文件:/ajax/system.php

d01148ab5ba697e7051f71706a74f4d8.png
292fe6a890968a4cb00b24a2d20a0364.png

不过这个地方应该是需要管理员登录的,登录之后传参是这个亚子的:

c796355d66fdb48dd641f1972b1a5bf9.png

可以采用和之前相同的时间盲注:

57be5e4b56b1efa3559b934dbbb8d966.png
42fe0db219d7c3b253ba7fe03ec94a63.png

再看另外一处漏洞:/api/call.php,此处不需要任何登录,可以在前台直接访问到文件,而且其中多个参数存在注入:

86afd12a0b5b6ccc97ac77e4dfa2c2bd.png
6b4974a6309df399d66a34e1e1042d5e.png

再之后很多便与上面的审计方法类似,还存在可以利用的点,也会存在许多无法利用的点,就不一一写出来了。

上面这个注入点还找到一个案例:

51a1b85d5b45d4b5d4ed1f0f1ad074c4.png

不过存在问题的便是这个CMS的密码加了一个固定字符串当作盐,在解MD5时会存在困难。

0x03 总结:

按照惯例,来小结几句。

关于SQL注入的防御,应该有很多方法了,首先就是不信任用户输入,严格过滤参数,之后的话还可以使用预查询方案,之后的话还可以使用软硬件防火墙。不过这些理论上都会存在bypass的情况,不过我太菜,不会bypass。

另外就是关于参数过滤,如同上面,执行参数过滤,但是依然找到了漏网之鱼,所以过滤策略某种情况下也是不可靠的。

最后就是关于代码审计了,代码审计一时爽,一直审计一直爽,奥力给!!!

声明:笔者初衷用于分享与普及网络知识,若读者因此作出任何危害网络安全行为后果自负,与合天智汇及原作者无关!



推荐阅读
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • 小程序wxs中的时间格式化以及格式化时间和date时间互转
    本文介绍了在小程序wxs中进行时间格式化操作的问题,并提供了解决方法。同时还介绍了格式化时间和date时间的互相转换的方法。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
author-avatar
縌风而行2010
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有