1. 程式人生 > >windows下sqli-labs的搭建及學習(POST篇)

windows下sqli-labs的搭建及學習(POST篇)

windows下sqli-labs的搭建及學習(GET篇):

Less-11:基於錯誤的_post_單引號_字元型注入

     post型的注入一般都是登入繞過,測試的方法與get都類似,通過檢視原始碼我們知道以post方式傳遞的兩個引數是uname和passwd,那麼首先來嘗試下單引號

     從這裡的報錯中可以知道後臺的sql語句應該是select username,password from table where username='$_GET['uname']' and password='$_GET['passwd']' limit 0,1

     而這裡之所以報錯是因為加號沒有被轉義,可以換成--%20來註釋後面的limit,然後我們可以構造永真語句繞過登入

     接著猜欄位數

     再試試3,報錯,說明用select查詢的是兩個欄位


    於是 用union來爆資料庫名


     依次爆表名,欄位

     最後的payload:

     這裡還有一個需要注意的地方,username和password的輸入框都可以作為注入點,但是在前一個引數處注入時只能註釋掉後面的語句,而在最後一個引數處注入時既可以註釋也可以閉合,閉合即uname=&passwd=' or 1='1,後一個1前的單引號會與limit前的單引號匹配(閉合)可以正常執行,之所以username那裡不能使用閉合,是因為一旦使用後語句將變成:

     select username,password from table where username='$_GET['uname']' or 1=1 and password='$_GET['passwd']' limit 0,1

     這裡的and運算子優先順序比or高,語句會先執行1=1 and password='$_GET['passwd']',因為我們並不知道正確的password值,故該語句必為flase,且username的值也是flase,兩者進行or運算,其結果也必然是flase

Less-12:基於錯誤的_雙引號_post_字元型_變形注入

     嘗試單引號沒反應,再試試雙引號

     繞過登入:

     方法同之前一樣,payload:

Less-13:單引號_post_字元型_雙注入_變形注入

     嘗試之前的方法,可以登入但沒有返回使用者資訊

     從原始碼中可以看到,輸出被註釋了

     於是嘗試雙注入,直接上payload:


Less-14:雙引號_post_字元型_雙注入_變形注入

     把less-13改成雙引號就行了

Less-15:單引號_post_bool型/時間型盲注

     輸入單引號和雙引號出錯但都沒顯示報錯,加入永真式單引號可以登入,但也沒有使用者資訊

     嘗試雙注入,仍然沒有使用者資訊返回

     檢視原始碼發現,他將輸出和sql報錯都註釋了,less-13僅註釋了輸出所以可以用雙注入

     這裡只能考慮盲注了,因為合法輸入和非法輸入返回的是不同的頁面,所以這裡可以用bool盲注,盲注通常都是先確定資料庫名,表名,欄位名的長度,然後再匹配內容,如下測試資料庫名的長度



     由此可以確定資料庫名的長度是8,接著來匹配名字的8位字母

     於是可以確定資料庫名的第一個字母是's',按照這個方法逐個去匹配,最好的方式還是寫個指令碼,省時省力

Less-16:雙引號_post_bool型/時間型盲注

     輸入uname=&passwd=") or 1=1%23顯示登入,其餘的和less-15沒有什麼不同,但也可以用來練下時間型盲注,可以構造如下兩種:

     uname=&passwd=") or (ascii(substr((select database()) ,1,1))) >115 or if(1=1, sleep(5), null)%23

     uname=&passwd=") or if(ascii(substr((select database()) ,1,1))>115,1,sleep(5))%23

Less-17:基於錯誤的_post_更新查詢注入

     單雙引號嘗試後,他的畫風始終是這樣子的

     注意到他的提示password reset,估計後臺會用到update,於是去翻了下原始碼,果然

     他的大概執行過程是接收到username和password後,首先根據username的值查詢資料庫返回username和password,然後再將原有的password值用接收到的值替換掉,這裡有一個問題是,username在接收時用了一個自定義的過濾函式check_input(),這個函式首先做了判空處理,合法就擷取username的前15個字元,然後是通過get_magic_quotes_gpc()的返回值判斷magic_quotes_gpc的值是on還是off:

     magic_quotes_gpc=on時, 不用對輸入和輸出資料庫的字串資料作addslashes()和stripslashes()的操作,資料也會正常顯示。

如果此時對輸入的資料作了addslashes()處理,那麼在輸出的時候就必須使用stripslashes()去掉多餘的反斜槓。      magic_quotes_gpc=off 時,必須使用addslashes()對輸入資料進行處理,但並不需要使用stripslashes()格式化輸出,因為addslashes()並未將反斜槓一起寫入資料庫,只是幫助mysql完成了sql語句的執行。
     最後,他用了ctype_digit()判斷username值的型別是否是數字,是字元就用mysql_real_escape_string對特殊字元進行轉義

     顯然,username這裡並不好注入,只有通過弱口令爆破,像是admin之類的,但是他對password的接收沒有做過濾的處理,於是我們可以在這裡動手腳

     對於update的注入有幾種思路,我們將他連同insert和delete一起來總結一下:
     1、子查詢注入
     子查詢注入原理即雙注入,對於dateup、delete和insert通常都是結合or的邏輯判斷,本題為例我們對update可以構造如下語句
     獲取資料庫名:

     獲取表名:

     獲取欄位名:

     獲取使用者資訊;

    這裡就 直接放insert和delete的後臺語句了,利用原理和構造的語句與update都是一樣的:
INSERT INTO users (username, password) VALUES ('admin',' or (SELECT 1 FROM(SELECT count(*),concat((SELECT concat(0x7e,0x27,cast(database() as char),0x27,0x7e) FROM information_schema.tables),floor(rand()*2))x FROM information_schema.tables group by x)a)%23);

DELETE FROM users WHERE id=1 or (SELECT 1 FROM(SELECT count(*),concat((SELECT concat(0x7e,0x27,cast(database() as char),0x27,0x7e) FROM information_schema.tables),floor(rand()*2))x FROM information_schema.tables group by x)a)%23;
     2、通過name_const():    
     name_const(name,value):
返回給定值,當用來產生一個結果集合列時, name_const()促使該列使用給定名稱
     但他的使用範圍受限,只適用於一些資料庫版本高於5.0.12,但又稍舊的版本,像現在的5.7版本就不用想了...然而我用的就是較新的版本,注入只能顯示資料庫的版本資訊,想要查詢其他的資訊,會顯示Incorrect arguments to NAME_CONST,所以,這裡我就不截圖了,直接放payload:
     獲取資料庫:
' or (SELECT * FROM (SELECT(name_const(database(),1)),name_const(database(),1))a) where username='admin'%23
     獲取表名:
' or (SELECT * FROM(SELECT name_const((SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema='security'),1),name_const(( SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema='security'),1))a)%23
     總的來說,對於update,insert和delete都有一個固定的結構:... or (select * from(select name_const((select ...),1),name_const((select...),1))a) ...
     3、通過updatexml():
     updatexml(xml_target,xpath_expr,new_xml)函式是MYSQL對XML文件資料進行查詢和修改的XPATH函式,xml_target是目標xml,形式類似於節點目錄,xpath_expr是xml的表示式,new_xml是用來替換的xml,簡單來說就是,用new_xml把xml_target中包含xpath_expr的部分節點(包括xml_target)替換掉,比如,updatexml(<a><b><c>asd</c></b><e></e></a>,'//b',<f>abc</f>)執行結果是<a><f>abc</f><e></e></a>,其中'//b'的斜槓表示不管b節點在哪一層都替換掉,而'/b'則是指在根目錄下替換,此處xml_target的根目錄節點是a
     利用updatexml()獲取資料的固定payload是:... or updatexml(1,concat(0x7e,(...)),0) ....updatexml()的xml_target和new_xml引數隨便設定一個數就行,這裡主要讓他報錯
     首先獲取資料庫名:

     獲取表名:

     獲取欄位名:

     獲取使用者資訊:

     報錯了,百度一下,說是不能先select出同一表中的某些值,再update這個表(在同一語句中),也就是說將select出的結果再通過中間表select一遍,這樣就規避了錯誤,其實之前在子查詢注入中也有用到此方法,同時,還要給多加的一重select賦一個別名
     注意,這個問題只出現於mysql,mssql和Oracle不會出現此問題

     最後總結一下payload:or updatexml(1,concat(0x7e,(select * from(select ....)a),0x7e),0)%23
     4、通過extractvalue():
     extractvalue(xml,value)函式也是MYSQL5.1以後推出的對XML文件資料進行查詢和修改的XPATH函式,注入時第一個引數隨便給一個數字
     直接上payload:

     payload:or extractvalue(1,concat(0x7e,(select * from(select ....)a),0x7e))%23

Less-18:基於錯誤的_post_使用者代理_頭部注入
    




參考文獻:
http://blog.csdn.net/ysynhtt/article/details/45115849
http://blog.csdn.net/priestmoon/article/details/8016121

相關推薦

windowssqli-labs搭建學習POST

windows下sqli-labs的搭建及學習(GET篇): Less-11:基於錯誤的_post_單引號_字元型注入      post型的注入一般都是登入繞過,測試的方法與get都類似,通過檢視原始碼我們知道以post方式傳遞的兩個引數是uname和passwd,那麼

windowssqli-labs搭建學習GET

環境搭建: 需要搭建以下環境: apache+mysql+php Tomcat+mysql+java(部分關卡需要)         apache的環境在windows下可以直接安裝wamp、phpstudy、apmserv等,我安裝的是wamp,安裝過程中可能會

關於php7.0Sqli-labs搭建的小問題

localhost set errno local into 除了 -o 進入目錄 小問題 由於前文中kali版本較新,默認安裝的是php7.0(this is the problem)PHP 5 的使用者可以使用 mysql extension,mysqli 和 PDO_

Go:windowsgo環境搭建IDE安裝過程

直接 mage download www 添加 系列 del 安裝包 目錄 /** * @Description windows下go環境搭建及IDE安裝過程 * @author ranx * @date 2018年11月23日 上午9:05:20 * */  一直都

WindowsRedis的安裝配置個人實踐總結版

  Windows下Redis的安裝及配置(個人實踐總結版)   目錄 前言 Redis服務的下載 Redis服務的安裝 Redis服務的啟動 Redis設定成Windows下的服務 Redis的連線 前言 Redis的安裝及配

windows測試磁盤讀寫HD Tune

hd tune hd tune測試磁盤讀寫速度 3個SATA磁盤組成RAID 5,4個SAS硬盤組成另外一個RAID 5。測試結果如下:用HD Tune測試讀速度:用HD Tune測試寫速度(需要刪除分區再測試):windows下測試磁盤讀寫(HD Tune)

git服務器的搭建使用第二章

etc log 指定 作者 取消 不起作用 -a 關聯 pat 一、git服務器創建倉庫   在普通用戶有讀寫權限的目錄下,創建git倉庫,切勿使用root創建(root創建的倉庫,普通用戶無寫的權限,導致提交失敗)。   mkdir xxx.git   git init

windows安裝zabbix客戶端配置遠端關機

1、將下載的客戶端解壓後的bin和conf目錄放置於C盤的zabbix目錄下 2、客戶端的安裝,附帶解除安裝 cd c:\zabbix\bin\win64 c:\zabbix\bin\win64>zabbix_agentd.exe -i -c C:\zab

LinuxMysql的安裝執行詳解

1、組及使用者建立: sudo groupadd mysql #新增組 sudo useradd -r -g mysql mysql #新增所建立組下的使用者 2、官方下載網址 wget http://downloads.mysql.com/archives/get/file/mysql-5

windows磁碟相關介面呼叫例項持續更新

windows下磁碟相關介面呼叫例項 1、windows下獲取磁碟空間介面呼叫例項 //windows下獲取磁碟空間介面呼叫 void GetDiskSpaceTest(void) { /* qwFreeBytesToCaller

Apache+php+mysql在windows的安裝與配置圖解最新版

先準備好軟體: 一、安裝Apache,配置成功一個普通網站伺服器 出現Apache HTTP Server 2.0.55的安裝嚮導介面,點“Next”繼續 確認同意軟體安裝使用許可條例,選擇“I accept the terms in the l

postgresql在windows備份的批處理檔案修改版,提示輸入密碼時,能自動輸入密碼

在網上找到一篇文章《PostgreSQL Windows自動備份指令碼》 覺得不錯,試了一下,發現批處理檔案執行停止在提示輸入密碼那。 >pg_dump -U postgres -W  database1 > c:/backup.tar >passwo

Ubuntu14.04搭建hadoop2.x單機

一、準備工作 1、安裝Ubuntu14.04的作業系統,在此不再詳細講述。 2、下載hadoop包,可以直接去 官網 下載。 3、截至到我寫這篇部落格時,最新版本為2.7.1,在此為了方便大家熟悉安裝和配置過程,仍然使用2.4.0的版本來介紹。

Windows一個複製和刪除檔案資料夾的bat指令碼

:: 指令碼建立時最好選擇GB2312編碼 :: @echo off 表示不回顯執行的命令 @echo off ::設定源路徑和目的路徑,使用該變數時需要用一對%包起來 set SRC_PATH=..

LINUXNFS的配置應用3.0

客戶端配置1.linux客戶端的使用(1)建立共享目錄為了更好地說明客戶端的配置使用,先重新建立兩個共享目錄。修改/etc/exports如下vi /etc/exports/media * (ro)/file * (rw)(2)重新啟動伺服器service nfs resta

windowspython安裝lxml類庫重新整理後

應小夥伴的要求,把原來的又修改整理了一下。 python安裝lxml類庫(windows環境下 )   這幾天為了使用python解析網頁找了不少方法,其中比較有用的是lxml。lxml是python使用xpath解析html時需要匯入的一個類庫,功

Android開發環境搭建HelloWorldADT-Bundle

1.首先下載Java的JDK這部就不多說了。2.下載ADT-BundleADT-Bundle是由Google Android官方提供的整合式IDE,已經包含了Eclipse,Android SDK及An

Python學習第一

logs 完全 python3 兩個 ges tex pytho 格式 代碼 說明:筆者所用的版本是python3.6 首先,說一下python的三種格式輸出。第一種用到了格式化操作符%,格式化字符串時,Python使用一個字符串作為模板。模板中有格式符,這些格式符為真實值

[ Python ] 基本數據類型屬性

獲取 string ast 轉換 分割字符串 upper not found 不可 inf 1. 基本數據類型 (1) 數字 - int (2) 字符串 - str (3) 布爾值 - bool 2. int 類型中重要的方法

docker簡易環境搭建實戰:以人人網開源專案renren-fast-vue搭建分散式部署前端

docker簡易環境搭建實戰篇:以人人網開源專案(renren-fast-vue)搭建分散式部署(前端篇) 寫在前面:注:閱讀本文前,請先閱讀docker標籤的docker簡易系列的文章。 前端最終實現的架構圖: 第一步 修改前端專案配置 修改專案目錄中 static/co