原文鏈接:http://blog.csdn.net/u012763794/article/details/51361152 上一次就講了基礎(chǔ)挑戰(zhàn)之less1-10:http://blog.csdn.net/u012763794/article/details/51207833,都是get型的,包含的種類也是比較多了,這次的是post型注入一般都是登陸繞過,當(dāng)然也是可
原文鏈接:http://blog.csdn.net/u012763794/article/details/51361152
上一次就講了基礎(chǔ)挑戰(zhàn)之less1-10:http://blog.csdn.net/u012763794/article/details/51207833,都是get型的,包含的種類也是比較多了,這次的是post型注入一般都是登陸繞過,當(dāng)然也是可以獲取數(shù)據(jù)庫的信息,具體看下面的實驗吧。
一些基礎(chǔ)的知識上一篇基礎(chǔ)挑戰(zhàn)之less1-10http://blog.csdn.net/u012763794/article/details/51207833會有,這里不會講以前講過了知識了,還有盲注的python腳步哦,有需要的鏈接去看看
工具
還是火狐+hackbar插件
看看要post提交的字段吧,uname和passwd(這個在username右邊的編輯框右鍵查看元素即可看到)

less11 POST - Error Based - Single quotes- String (基于錯誤的POST型單引號字符型注入)
判斷方法,上篇說過了,直接來個單引號,報錯

我們把 整個被單引號引著的復(fù)制下來
把左端和右端的單引號去掉,就變成下面的
test' LIMIT 0,1 test右邊有個單引號,這里怎么跟get的報錯不一樣了(get的單引號報錯,test后面有兩個單引號),不管了,post就當(dāng)這樣了。
那么判斷是單引號注入了
直接來個永真的,加注釋,登陸成功

當(dāng)然除了用注釋還可以閉合單引號,當(dāng)這里有個問題探討,看下圖

為什么登陸失敗呢,我們看看最終這個sql語句,
首先and的優(yōu)先級高于or 【就是and先運(yùn)算】
那么 '1'='1' and password='test' 先運(yùn)算,因為users表里面的password字段沒有一個數(shù)據(jù)時test,右邊是false,那么整個表達(dá)式就是false
為了方便理解,看下面三張圖,第一張為users表,第二張可以看到結(jié)果是0(這個就是false了,看低三張圖)



既然右邊是false
那么語句就變成 SELECT username, password FROM users WHERE username='test' or false
username='test' 沒有這一行數(shù)據(jù)吧,右邊是false,or也救不了你了

所以我們要怎么辦呢,uname這里不行,我們嘗試passwd咯,發(fā)現(xiàn)是可以的

下面文字解釋一下吧,有了上面的基礎(chǔ),應(yīng)該就比較容易理解了
首先and先運(yùn)算
username='test' and password='test' 返回false(0)
'1'='1' 肯定是true(1)了
最終語句等價于
SELECT username, password FROM users WHERE 0 or 1;
那么就肯定可以繞過登陸了
那么總結(jié)一下:一般第一個登陸字段(一般是用戶名)就用注釋,第二個登陸字段(一般就密碼)用閉合和注釋都是可以的
此外,我們這里還可以通過盲注獲取數(shù)據(jù)庫信息


這個當(dāng)然也是寫個腳步來跑啦
有空我改造之前的那一篇的python腳本,盲注一下這里
less 12 POST - Error Based - Double quotes- String-with twist (基于錯誤的雙引號POST型字符型變形的注入)
先用什么單引號雙引號看看,報錯就看出它有沒有用引號,或者加了其他東西

那么這里明顯看出用)將變量括著,那么直接繞過

less 13 POST - Double Injection - Single quotes- String -twist (POST單引號變形雙注入)
單引號看出有),直接永真+閉合

less 14 POST - Double Injection - Single quotes- String -twist (POST單引號變形雙注入)
這個跟上一課的名稱一樣吧,但其實這是雙引號的
單引號沒報錯,雙引號就報錯了,這個比上面兩個簡單
less 15 POST - Blind- Boolian/time Based - Single quotes (基于bool型/時間延遲單引號POST型盲注)
這里輸入單引號,雙引號就不會報錯了,我們只能加上永真用假或者時間延遲函數(shù)了
確定單引號盲注
盲注這種事情當(dāng)然編程實現(xiàn)才好了
less 16 POST - Blind- Boolian/Time Based - Double quotes (基于bool型/時間延遲的雙引號POST型盲注)
這次就用時間延遲的吧
uname=a&passwd=a") or 1=1# ,判斷為雙引號變形
測試:
uname=a&passwd=a") or if(length(database())=7,1,sleep(5)) #
uname=a&passwd=a") or if(length(database())=8,1,sleep(5)) #
less 17 POST - Update Query- Error Based - String (基于錯誤的更新查詢POST注入)
注意:下面的注入,一不小心可能把數(shù)據(jù)庫的user表的密碼表給清空了
這個應(yīng)該跟xpath注入有點(diǎn)關(guān)系
xpath教程看這 http://www.w3school.com.cn/xpath/
還有個函數(shù)
updatexml,這個函數(shù)搜了很久都不見其介紹,都是直接給個payload:updatexml(1,concat(0x7e,(version())),0),這函數(shù)什么意思,每個位置的參數(shù)對應(yīng)什么,什么都沒說,我也是醉了,后來直接在mysql控制臺直接help搞掂,瞬間跪了,看了學(xué)東西還是官方的好啊,有解釋有例子,很好
可以看到可以看到
第一個參數(shù)是 目標(biāo)xml
第二個參數(shù)是 xpath的表達(dá)式,這個看w3c那個xpath教程
第三個參數(shù)是 要將xpath的表達(dá)式的東西將目標(biāo)xml替換成什么
實踐了一下上面的例子,你就會理解
第一個直接將a結(jié)點(diǎn)的內(nèi)容包括a直接替換為
fff了
第二個是因為第一個結(jié)點(diǎn)并沒有b結(jié)點(diǎn)所以沒有變化, /就相當(dāng)于linux的根目錄咯
第三個例子就不管b在哪一層,只要找到就替換
而且發(fā)現(xiàn)只能替換一個結(jié)點(diǎn)
好了,大家好好理解,我們開始注入
這個我也沒怎么接觸,先看看代碼
首先有個過濾函數(shù), check_input
check_input首先判斷不為空,就截取前15個字符,
當(dāng)magic_quotes_gpc=On的時候,函數(shù)get_magic_quotes_gpc()就會返回1
當(dāng)magic_quotes_gpc=Off的時候,函數(shù)get_magic_quotes_gpc()就會返回0
magic_quotes_gpc函數(shù)在php中的作用是判斷解析用戶提示的數(shù)據(jù),如包括有:post、get、cookie過來的數(shù)據(jù)增加轉(zhuǎn)義字符“\”,以確保這些數(shù)據(jù)不會引起程序,特別是數(shù)據(jù)庫語句因為特殊字符引起的污染而出現(xiàn)致命的錯誤
若開了就將轉(zhuǎn)義符去掉
ctype_digit判斷是不是數(shù)字,是數(shù)字就返回true,否則返回false
是字符就用mysql_real_escape_string過濾,其實基本就是轉(zhuǎn)義(轉(zhuǎn)義 SQL 語句中使用的字符串中的特殊字符,并考慮到連接的當(dāng)前字符集),這樣就把寬字節(jié)cut了
是數(shù)字也要用intval轉(zhuǎn)化成int,因為傳過來的是字符型數(shù)字
function check_input($value){
if(!empty($value)){
// truncation (see comments)
$value = substr($value,0,15);
}
// Stripslashes if magic quotes enabled
if (get_magic_quotes_gpc()){
$value = stripslashes($value);
}
// Quote if not a number
if (!ctype_digit($value)){
$value = "'" . mysql_real_escape_string($value) . "'";
}
else{
$value = intval($value);
}
return $value;
}
可以看到只對uname過濾,那么我們從password入手咯
首先通過用戶名查詢出用戶名和密碼,再更新那個用戶的密碼
首先要繞過通過用戶名查詢出用戶名和密碼,這個我們只能猜吧,比如admin,root,test什么的,這個可以用字典
在這里我們就當(dāng)知道是admin了,直接用admin就考慮下一步
我們看看payload,updatexml的第一個參數(shù)和第三個參數(shù)隨便一個數(shù)字就行
其實不要1= 也是可以的,我們要的是執(zhí)行updatexml執(zhí)行的時候報錯
關(guān)鍵在第二個參數(shù)的理解,為什么要這樣
我們可以看到第二個參數(shù)直接version()那個版本信息顯示不全,
我們在version兩邊加個左右括號(十六進(jìn)制分別是0x28,0x29)看看, 可以看到多了右邊的括號
我們再在兩邊加個+(0x2b)號看看,我們看到已經(jīng)完整顯示出來了
當(dāng)然再加一個也是可以的
甚至只有前面連接也是可以
還有很多,就不列舉了
通過實驗,報錯的時候只會顯示后面的一部分,但是我們在前面添加的字符,那么除了第一個字符,整個字符都顯示出來了,要從根本理解,可能看xpath的報錯輸出函數(shù)?
下面開始真正的注入過程吧
獲取當(dāng)前數(shù)據(jù)庫
用戶
數(shù)據(jù)表,

用用limit控制第幾個表就行,一次只能出一行數(shù)據(jù)哦,多行是不能把信息爆出來的
當(dāng)然那個數(shù)據(jù)庫那里,單引號沒過濾用單引號括著security也行
看看users表有什么列
依次查出有id, username,password
接下來就搞數(shù)據(jù)了,發(fā)現(xiàn)不能不能先select出同一表中的某些值,再update這個表(在同一語句中)
我們再加一層select行不行呢,還要給里面那層給個別名哦
那就起個hack名咯,在整個select語句后面加就行,終于搞出來了,挺艱難的
less 18 POST - Header Injection - Uagent field - Error based (基于錯誤的用戶代理,頭部POST注入)
這里對用戶名和密碼都加了過濾
當(dāng)這個怎么判斷存在uagent頭存在注入呢,是因為他獲取了我們的ip,猜它應(yīng)該也獲取了uagent?當(dāng)然不靠普,這個靠模糊測試吧(其實就是靠發(fā)單引號啊什么的用程序去測試返回結(jié)果),還有請使用xxx瀏覽器訪問的,有可能獲取了uagent,但也可能只是前端的js來處理
那么用什么工具手注呢,burp的repeater非常方便,用火狐的某些插件應(yīng)該也可以如live http headers,tamper data,下面我用live http headers插件
首先這里要輸入正確的賬號和密碼才能繞過賬號密碼判斷,進(jìn)入處理uagent部分,這里跟我們現(xiàn)實中的注冊登錄再注入是比較貼合,這里我們輸入正確的賬號密碼就輸出我們的uagent
跟上節(jié)一樣, 獲取數(shù)據(jù)庫
這次我們就不獲取users表了,獲取emails表吧,更改limit的偏移即可獲取全部
less 19 POST - Header Injection - Referer field - Error based (基于頭部的Referer POST報錯注入)
當(dāng)然這里用updatexml也是可以的
這里介紹另一個報錯函數(shù)extractvalue
更詳細(xì)自己去看看,第一個參數(shù)也是個xml,第二個參數(shù)就是xpath的表達(dá)式,這個函數(shù)是獲取xml中某個節(jié)點(diǎn)的值
看看例子,可以看到與updatexml一次只能更新一個節(jié)點(diǎn)不同,extractvalue可以一次獲取多個節(jié)點(diǎn)的值,并以空格分隔
接下來開始注入吧(主要這里的是extractvalue函數(shù)只要兩個參數(shù)哦,updatexml是3個)
其實思路都是差不多
這里直接上最后結(jié)果
less 20 POST - Cookie injections - Uagent field - Error based (基于錯誤的cookie頭部POST注入)
看了下代碼
首先判斷有無cookie,沒有的話,查詢出來再設(shè)置cookie
若cookie存在,又分兩種情況,
第一種情況,你登陸過,cookie還有效,你沒按刪除cookie的按鈕,那么他就輸出各種信息,包括刪除cookie的按鈕
if(!isset($_POST['submit'])){
$cookee = $_COOKIE['uname'];
$format = 'D d M Y - H:i:s';
$timestamp = time() + 3600;
echo "";
echo '
';
echo '
';
echo "
";
echo '
';
echo "YOUR USER AGENT IS : ".$_SERVER['HTTP_USER_AGENT'];
echo "
";
echo '';
echo "YOUR IP ADDRESS IS : ".$_SERVER['REMOTE_ADDR'];
echo "
";
echo '';
echo "DELETE YOUR COOKIE OR WAIT FOR IT TO EXPIRE
";
echo '';
echo "YOUR COOKIE : uname = $cookee and expires: " . date($format, $timestamp);
echo "
";
$sql="SELECT * FROM users WHERE username='$cookee' LIMIT 0,1";
$result=mysql_query($sql);
if (!$result){
die('Issue with your mysql: ' . mysql_error());
}
$row = mysql_fetch_array($result);
if($row){
echo '';
echo 'Your Login name:'. $row['username'];
echo "
";
echo '';
echo 'Your Password:' .$row['password'];
echo "";
echo "
";
echo 'Your ID:' .$row['id'];
}else{
echo "
";
echo '
';
echo '
';
echo "
";
//echo '
';
}
echo '
';
echo '';
echo '';
}
第二種情況,你按了刪除cookie的按鈕
后臺就把cookie的時間設(shè)置為過期的時間,那么cookie就被刪除了
那么我們的目標(biāo)登陸完后對cookie的注入,核心代碼在下圖
首先判斷方法什么的都是通用的,我就不啰嗦了
3列返回正確,所以users表有三列
直接上最后獲取到的email信息吧
less 21 Cookie Injection- Error Based- complex - string ( 基于錯誤的復(fù)雜的字符型Cookie注入)
這里是base64 ,單引號+括號,其實跟20差不多啊
less 22 Cookie Injection- Error Based- Double Quotes - string (基于錯誤的雙引號字符型Cookie注入)
這個跟less20,21差不多,這里是雙引號,還要base64編碼了的,有強(qiáng)大的hackbar怕什么,
http://blog.csdn.net/u012763794/article/details/51361152
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com