十有八九是注入,不過測試引號和轉義符並沒發現什麼,因而跑了下密碼字典,居然發現網頁提示 sql injection detected! ,而後發現原來是密碼中存在or關鍵字php
測試了username處發現未攔截關鍵字,那注入點應該只存在於password,那麼應該就是username填admin,password處構造SQL語句條件爲真便可html
試了好久才發現原來是考寬字節注入,payload以下mysql
username=admin&password=%df'<>1#sql
後臺語句則會是less
SELECT * FROM users WHERE username='admin' AND password='?'<>1
password='?' 爲假即0,0<>1爲真,因此整條語句爲真函數
SQL約束攻擊測試
註冊一個帳號編碼
admin xxx (中間多幾個空格)spa
123456789code
而後以admin:123456789登陸
一開始瞎嘗試毫無頭緒,後才發現有源碼泄露
http://chall.tasteless.eu/level12/lucky.php~
代碼爲
<?php $k=$_GET['emit']; $a=substr(sprintf("%8x%05x\n",floor($k),($k-floor($k))*1000000),0,-3); $b=substr(uniqid(),0,-2); if($a==$b){ print "WTF?! YOU REALLY DID IT <3<br /> flag is: t1m1ng4tt4ck"; } else { print "VAR a is ".$a."<br />"; print "VAR b is ".$b."<br />"; } ?>
...
沒錯flag就在源碼裏,t1m1ng4tt4ck
不過仍是要研究一下這題的正常解法
$a=substr(sprintf("%8x%05x\n",floor($k),($k-floor($k))*1000000),0,-3);
$a前8位是floor($k),後5位是($k-floor($k))*1000000),即後5位取決於小數部分,而後被substr,只取前11位
$b=substr(uniqid(),0,-2);
uniqid() 函數基於以微秒計的當前時間,生成一個惟一的 ID
$b的11位都取決於當前時間
因此就要構造一個比當前時間大一點的payload,而後用burp不斷髮包,直到恰好撞上
待更
待更
待更
字符集的問題
註冊的時候admin後面加上\xC2
登陸以admin便可
http://chall.tasteless.eu/level20/index.php?view=flag as Quality from level20_flag join level20`
實驗室的小夥伴試出來的,我以前有想過join,可是題目ban了註釋符,就一直沒想到繞過方法,至於爲何這裏反引號能當註釋用,目前仍是不清楚,正在研究。。。
更:mysql中起別名用as,但as能夠省略,而在能夠起別名的地方,用上反引號,其後的內容都會做爲別名