SQLI1
- 공격벡터
userinput 필터링 없이 받아 쿼리문에 사용
- exploit 과정
?userid=admin’ %23&userpw=123 하면 된다.
# 그대로 입력 시 그 뒤가 fragment로 인식되어 %23 이렇게 인코딩했다
SQLI2
- 공격벡터
union 막혀있고, or 이랑 | 전부 막혀있다, 하지만 + 사용 가능하다
공백 = %0a로 우회 가능하다
주석 = -는 막혀있지만 #은 가능하다. 대신 url에서 %23 인코딩해야 fragment 취급 안 받음
의도하지 않았지만 발견한, MySQL의 독특한 type casting 때문에 발생한 취약점
(https://stackoverflow.com/questions/22080382/mysql-why-comparing-a-string-to-0-gives-true)
MySQL은 + - * / % 이런 arithmetic operators 과 사용되거나, 숫자와 비교 시 자동으로 string을 숫자로 casting 한다
=> 숫자로 시작하는 string은 해당 숫자로 casting (‘1string’ = 1 , ‘0string’ = 0)
=> 숫자로 시작하지 않는 string은 0
따라서 ‘a’ + ‘b’ 는 0 + 0 = 0 으로 계산될 것
그리고 userid = 0 구문은 userid가 숫자로 시작하지 않는 문자열일 경우 true일 것
- exploit 과정
+ 랑 # 모두 url에서 특별한 의미를 지니므로 encoding 필수이다
?userid=a’%2b’b’%23&userpw=aaa 이렇게 payload 보내면 첫번째 record인 guest가 출력된다
?userid=a’%2b’b’%0aand%0auserid%0alike%0a’admi_’%23&userpw=aaa 이런 식으로 조건에 userid 포맷을 추가해주면 된다.
SQLI3
- 공격벡터
SQLI2와 동일한 공격벡터 사용하면 된다.
대신 userpw가 플래그이므로 blind SQLI를 실행하면 된다
userpw like “flag{%” 에서 한글자씩 추가해나가며 “Hello admin”이 언제 출력되나 파악하자
?userid=ad'%2b'min'%0aand%0auserid%0alike%0a'admi_'%0aand%0auserpw%0alike%0a'flag{ %%'%23&userpw=aaa 했더니 Hello Admin 메시지 뜨는 것 확인
+는 %2b로 인코딩, space는 %0a로 우회, %는 %%로 인코딩, #은 %23으로 인코딩
- exploit 과정
이렇게 돌렸더니
flag{true_true:_,binsearch_is_good} 답이 아니었음! binsearch_is_good는 그럴싸한 포맷이므로 그대로 두고, 앞에 두 _ (언더바) 자리에 input 제한 때문에 검사하지 못한 문자들이 들어가지 않았을까 추측함
=> 플래그 확인 페이지에서 브포 돌림
플래그 나옴
'security > 화이트햇' 카테고리의 다른 글
웹해킹 문제 - Nodejs (0) | 2024.01.09 |
---|---|
Mini CTF - LFI, Command Injection, SSTI (0) | 2024.01.09 |
Mini CTF - XSS, DOM Clobbering (0) | 2024.01.07 |
Mini CTF - XSS, DOM Clobbering (0) | 2024.01.07 |
IDA에서 사용자 정의 구조체 생성하기 (1) | 2024.01.06 |