SQL注入

2022-08-18 08:48:14 字數 2987 閱讀 7277

sql注入

sql注入是web應用後台資料處理檔案對使用者輸入資料沒有嚴謹性的判斷和過濾。攻擊者可以在web應用程式中事先定義好的查詢語句的結尾上新增構造特殊sql語句,在管理員不知情的情況下實現越權的操作。從此實現獲取、修改、刪除資料庫資訊,爆庫、和資料庫偷取,甚至提取伺服器超級管理員的權利。sql注入漏洞在2023年至2023年期間在owasp top10排行榜為榜首。

注:期間利用mysql語句進行詳細講解

注入點sql注入點通常在前端頁面控制項和後端資料庫有鏈結的地方。

原理

這是一段後台處理sql語句的php**

<?php

if(isset($_get['submit'])){

//retrieve data

$id=$_get['id'];

$getid= "select firset_name,iast_name from users where user_id='$id'";

$result=mysql_query($getid) or die('' .mysql_error().'

');

$num=mysql_numrows($result

);

$i=0;

?>

'$id'這個變數是我們要輸入的語句,構造語句只能在這塊進行構造,其他語句是不能看見也不能動的。

資料庫中有乙個欄位為id欄位這個欄位的值從1——無限,而$id這個值就是資料庫id欄位的值,這個id欄位後面對應的其他字段值是本使用者的其他資訊。

如果讓$id的值等於 ' ,如果資料庫id欄位的資料型別是整數型別肯定會報語法錯,如果資料庫id欄位的資料型別是字元型,那就要看這個欄位中是否有單引號這個值,有的話web頁面進行資訊改變,如果沒有還是會報錯。

其實要想獲取乙個庫資訊,表資訊,字段資訊有直接查詢,聯合查詢,布林查詢,都可以獲取需要知道的資訊。

上面的php**中有 select firset_name,iast_name from users where

user_id='

1'; 這個語句在mysql中輸入結果是獲取id為1的firset_name和iast_name的值,但是它**中沒有對id值進行說是必須輸入什麼值,那這會導致使用者會輸入' or 1=1 --'

select firset_name,iast_name from users where

user_id='

'or 1=1 --''

;

這樣的語句在sql中屬於正常語句,攻擊者利用' or 1=1 --'中第乙個單引號閉合了原有的單引號利用--'注釋了後邊的單引號,它可以輸出這個表中所有的有關值,這樣就達到攻擊者在本不應該知道其他資料的情況下知道了。

1

.通過google搜尋

inurl:.php?id=inurl:.jsp?id=inurl:.asp?id=inurl:/admin/login.php

inurl:.php?id=intitle:主頁

2inurl:news.asp?id=site:edu.cn

inurl:news.php?id=site:edu.cn

inurl:news.aspx?id=site:edu.cn

傳入sql語句可控參分為兩種

整形:?id=1

字元型:?id="1"

進行簡單測試看是否存在注入可能:

輸入 ?id='

。正常顯示頁面可能不存在注入性,但是不一定。

解釋:輸入乙個單引號判斷後台語句對單引號是否進行了過濾,因為sql都是利用單引號進行構造sql語句的。

輸入 ?id='真條件'

and sleep(5) --任意值

。頁面執行5秒鐘,說明此頁面可能含有注入性。

解釋:輸入後後台可能只對單引號進行了過濾,我們還是可正常利用單引號構造特殊sql語句對web應用進行sql注入。至於後面的「--任意值」是對後面的一切進行注釋。

在union注入中後面構造的語句中的字段數量要和前面的字段數量一樣多否則會報錯,如果不知道前面字段數量可以輸入select 1,2,.....來猜字段,輸入select 1直接進行查詢不會出錯,如果要查的字段比較多可以利用拼接查詢。

常用sql注入語句

'

or 1=1 --

'#爆出資料庫其他資訊

admin'--

' #可直接越過登入頁面,也稱php萬能密碼

自動化注入sqlmap使用python寫的乙個自動化sql注入工具,他還可以自動用谷歌搜尋可以注入的頁面。

下面是sqlmap的簡單說明

-p    #指定url中的注入點

--batch #全程自動化

--users #所有使用者

--current-user #當前使用者

--dbs #所有庫

--current-db #當前庫

-d "

database_name" --tables #database_name庫中有哪些表

-d "

database_name" -t "table_name" --columns #database_name庫table_name表中有哪些字段

--dump-all #顯示整個web庫中所有資料庫和所有庫的表

--dump-all --exclude-sysdbs #排除系統庫

-d "

database_name" -t "table_name" --dump #顯示字段

-d "

database_name" -t "table_name" -c "user,name" --dump #只顯示user和name欄位資訊

--cookie="cookie"  #帶入cookie值進行登入注入

SQL注入(三) sql注入 bugku

原理 mysql 在使用 gbk 編碼的時候,會認為兩個字元為乙個漢字,例如 aa 5c 就是乙個 漢字 前乙個 ascii碼大於 128 才能到漢字的範圍 我們在過濾 的時候,往往利用的思 路是將 轉換為 換的函式或者思路會在每一關遇到的時候介紹 因此我們在此想辦法將 前面新增的 除掉,一般有兩種...

SQL注入 報錯注入

乙個帶get引數的 並且不從資料庫返回資料,但存在報錯資訊 檢視字段情況 報錯注入語句格式 and 1 2 union select1,2,3 from select count concat floor rand 0 2 sql語句 a from information schema.tables...

SQL注入 報錯注入

sql注入基礎 盲注 用於注入結果無回顯但錯誤資訊有輸出的情況 floor函式 返回小於等於某值的整數,例如floor 1 則返回1,floor 1.9 也返回1 rand函式 生成隨機數.可指定seed,指定後每次生成的數都一樣即偽隨機,不指定seed則每次生成的隨機數都不一樣.通過floor和r...