2017년 8월 4일 금요일

H3X0R CTF3 - misulgwan (100pt)

WEB - misulgwan (100pt)

made by munsiwoo



워밍업 문제 다음으로 많이 풀어주신 문제다.
php를 조금이라도 알고 있다면 쉽게 풀 수 있다.

(작품은 모두 본인이 그렸다)


 view-source



 /misulgwan/view.php?view-source



설명

$_GET['image']와 $_COOKIE['length']가 있다면
$_GET['image']의 확장자 검사를 한다.

png, jpg, bmp가 아니라면 no hack을 띄우는데
여기서 ?image=abcde.php.jpg
이렇게 하고 쿠키 length를 9로 주면
확장자 검사는 통과하고 fopen으로 여는 파일은 abcde.php가 된다.
(fpassthru는 파일 컨텐츠를 사용자에게 바로 출력해주는 함수다)

view.php에 flag is in the flag.php라고 적혀있으니
flag.php를 fopen으로 열어서 fpassthru 출력 내용을 확인하면 된다.

payload
javascript:document.cookie="length=11"
/misulgwan/view.php?image=../flag.php.png



flag : H3X0R{munhwabaek_is_back}



H3X0R CTF3 - is this possible? (1000pt)

WEB - is this possible? (1000pt)

made by munsiwoo




?go=id

풀이

go라는 테이블에 위의 순서대로 레코드가 담겨있다.
문제의 핵심은 필터 키워드를 사용하지 않고 레코드의 순서를 바꾸는 것이다.

순서를 바꾸는 방법은 여러 가지가 있는데
출제자가 의도했던 풀이 방법은 ord(), crc32(), sha1()와 같은 함수를 사용하여
기존의 레코드를 다른 값으로 바꿔서 순서를 바꾸는 것이었다.

ex) crc32("admin") == 2282622326
crc32(crc32("admin")) == 2979564489
sha1("admin") == d033e22ae348aeb5660fc2140aec35850c4da997
ord("a") == 97
ord(ord(ord("a"))) == 53

위와 같이 함수 안에 함수를 넣는 방법으로 레코드를 계속해서 바꿀 수도 있다.
이렇게 레코드값을 바꾸는 방법으로 순서를 바꿀 수 있다.

두 번째 if문은 == 연산자로 비교하므로 쉽게 우회할 수 있다.
ex) (int)19990301 == 19990301abcdef (True)
(int)19990301 == 19990301.00 (True)

payload1 (munsiwoo)
?go=crc32(crc32(crc32(crc32(id))))&foo=19990301abcdef

payload2 (adm1nkyj)
?go=(case/**/when/**/((hex(id)-6775657374)*(id-20010609)*(id-19970101))/**/then/**/id/**/else/**/0/**/end)&foo=19990301.00


flag : H3X0R{03c7c0ace30182db0795ae2c30f03d84}




2017년 8월 3일 목요일

H3X0R CTF3 - sihpc (1000pt)

WEB - sihpc (1000pt)

made by munsiwoo




(프로그래밍 대회 컨셉)


설명
우선 문제 설명의 "flag is in the db"와 힌트의 "sqlite"로
sqlite injection 이란걸 추측할 수 있다.
원래 sqlite라는 힌트가 없었지만 풀이자가 적어서 추가했다.
처음 힌트는 query error로 sqlite인걸 알 수 있게 해놨다가
다시 수정해서 그냥 hint에 sqlite를 써놨다.

출제자가 의도한건 comment로 dbms를 판별하여
그 dbms에 맞게 인젝션하는 것 이었다.

풀이
가입 후 로그인을 하면 로그인 세션과 uname이란 쿠키가 생성된다.
uname은 ID를 base64 -> hex -> base64 -> hex 순으로 인코딩 한 것이다.
"admin"을 base64 -> hex -> base64 -> hex 순으로 인코딩하면
admin으로 로그인이 가능하다.
(uname=4e546b314e7a55794e7a51324d5455334d7a517a5a413d3d)

* 사이트의 관리자 권한을 얻으면 문의 관리가 가능하다.

이제, SQL Injection 취약점을 찾으면 되는데
문의 페이지의 이메일 부분에서 SQL Injection 취약점이 발생한다.
인젝션 포인트 : insert into table_name values ('ip', '[여기]', 'contents');

hint에서 dbms가 sqlite인걸 알았으니 dbms에 알맞게 인젝션해주면 된다.

 * mysql는 information_schema에 스키마 정보를 담고있지만
sqlite는 sqlite_master에 모든 정보를 담고있다.

(sqlite_master 구조)


', (select group_concat(sql) from sqlite_master));
(문의 페이지)


iamFLAG 테이블, flag 필드 확인
(문의 관리 페이지)


'; (select flag from iamFLAG limit 1));
(문의 페이지)


(문의 관리 페이지)



payload
테이블, 필트명 확인 : ', (select group_concat(sql) from sqlite_master));
플래그 : ', (select flag from iamFLAG limit 1));

FLAG : H3X0R{mY_NamE-IS_MUNSIWOO}