WriteUp
web1
是一道正則匹配繞過的…web2
是一個sql
注入題,web3
大概也是sql
注入吧。
Web1
源碼貼出來:
<?php
error_reporting(0);
if(!isset($_GET['act']) || !isset($_GET['p'])){
highlight_file(__FILE__);
exit();
}
if(trim($_GET['act']) === "" || trim($_GET['p']) === ""){
die('no null!');
}
$act = $_GET['act'];
$act = addslashes($act);
$p = $_GET['p'];
$p = addslashes($p);
if(preg_match('/[A-Za-z0-9(){};<>`]/i',$p) == 1){
die('waf');
}
if(preg_match('/[{};<>`]/i',$act) == 1){
die('waf');
}
if(preg_match('/[A-Za-z0-9(){};]+\(/i',$act) == 1){
die('hacker, your act has some problems!');
}
echo $p.$act;
echo $_;
eval($p.$act.';');
理解了大半天,最後還是把正則表達式給理解錯了…心塞。
[] 是定義匹配的字符範圍。比如[a-zA-Z0-9]表示相應位置的字符要匹配英文字符和數字。
對p
參數的限制是不能輸入任何出現在[]
之間的字符,單獨輸入字母、數字、括號等都是會被匹配到的。
對act
參數的限制首先是不允許輸入{};<>
中的任何一個字符。再其次,要求[]
中的任意字符不能直接接(
,剛開始理解爲壓根不能出現(
…
最終的payload
爲:
?p=$_&act=GET[1]()&1=phpinfo
當時做題的時候對正則表達式會一直匹配,直到結束理解不太深刻吧。
Web2
這是一道原題。suctf2018 mutilsql
做的時候可以通過盲注拿到數據庫user()
的值爲suctf@host
…當然也是運氣好,恰好測試了這個字段,然後就去找原題,很順利地找到,直接用了poc
…就getshell
,拿到flag
了。
題目的問題是:
後臺在顯示用戶的信息的時候,會在數據庫中進行一個查詢操作,這裏存在一個二次注入。後臺的sql
語句應該是:
select * from xxx where username='username'
在註冊時候單引號等等應該都被過濾了,但是在再次查詢時候過濾不夠,導致sql
注入。
Web3
沒有思路,只知道過濾了一些報錯注入會用到的函數。