只做出了第一题,然后就卡在第二题的Java了。。蛋疼。。
闯关式的比赛。。也挺蛋疼。看不到后面的题目。。
题目开放一年。参考了大佬的writeup,复现了一下其中三题Web。
https://clannad.me/ddctf.md.html
http://sec2hack.com/ctf/ddctf-2018-web-writeup.html
0x01 数据库的秘密
常规sql注入。修改XFF头进入页面,有一个hidden字段author
。
正常搜索了几波,发现请求时会带上GET参数sig
和time
。
查看了下JS代码可知,time是单纯的秒级时间戳,sig是请求内容拼接上变量key
之后sha1的哈希值。(key在HTML源码里)
利用flask转发HTTP数据包。
|
|
然后就丢sqlmap跑吧,注意这里or
和and
是被拦了,要用||
和&&
绕一下,使用--tamper=symboliclogical
。
|
|
0x02 注入的奥妙
注释中提示了BIG5编码。选了后一个字节为5C的么
字,可以宽字节注入。由于<>
会被replace成空,并且对关键字的过滤并不是循环过滤。因此可以双写绕过或者在关键字中插入<>
。
|
|
id | pattern | action |
---|---|---|
1 | get*/ | u/well/getmessage/ |
12 | get*/ | u/justtry/self/ |
13 | post*/ | u/justtry/try |
15 | static/bootstrap/css/backup.css | static/bootstrap/css/backup.zip |
访问/static/bootstrap/css/backup.css
即可拿到源码。
在/Helper/Test.php
的getflag()
方法中输出了flag。$this->fl->get($user)
可知$this->fl
为Helper/Flag.php
中Flag
类的一个实例。代码审计时可发现在/Controller/JJusttry.php
的try($serialize)
方法中存在反序列化漏洞。
|
|
通过构造字符串,根据路由规则POST数据到justtry/try
,反序列化后可构建一个Test
实例。即可输出flag。
|
|
namespace
指定命名空间- 在命名空间字符串过长时,使用
use
可以相应的缩短命名空间。 - https://www.cnblogs.com/drunkhero/p/namespace.html
0x03 我的博客
rand()
和str_shuffle()
的预测。在Linux中,PHP的rand()
函数是调用glibc库中的rand函数,是有缺点的,可预测。详情看这里->Cracking PHP rand()。
|
|
当取的随机数大于31位时,后面的随机数可通过上述式子推出,预测值有时会比实际值少1
由于str_shuffle()
依赖 rand()
进行字符串随机操作。因此可通过预测rand()
的值来预测出admin的code。而每一次的rand值可以从注册表单的csrf字段中获得。PHP的str_shuffle()
可参考 PHP 5.6.35 string.c L5394
|
|
运行脚本后可得到注册后admin身份的帐号密码。登录后,在index.php
的源码中可发现存在sprintf
注入漏洞。对于php中sprintf格式化字符串漏洞可见 https://paper.seebug.org/386/
简单的说就是sprintf中%1$\'
会将\
吃掉,导致'
的逃逸。%
后表示第几个参数,$
表示参数类型。
还有一个sprintf漏洞的利用方式:%c
起到了类似chr()
的效果,将数字39转化为'
,从而导致了sql注入。
|
|
在这题中,--prefix
加个前缀丢进sqlmap跑就好了。
|
|
话说。。看了大佬的writeup才知道sqlmap有前缀--prefix
和后缀--suffix
这种东西。