Iriton's log
[los.rubiya] orc write-up 본문
query:
select id from prob_orc where id=’admin’ and pw=’’
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\\.|\\(\\)/i', $_GET[pw])) exit("No Hack ~_~");
$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));
if($result['id']) echo "<h2>Hello admin</h2>";
$_GET[pw] = addslashes($_GET[pw]);
$query = "select pw from prob_orc where id='admin' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc");
highlight_file(__FILE__);
?>
이 문제는 패스워드를 맞춰야 하는 문제이다.
코드를 직접 짜서 비밀번호를 유추하는 문제인데 혼자 하기 어려워서 구글링을 해 보았다.
참고: https://man-25-1.tistory.com/81
풀이는 두 부분으로 나눠서 해결할 수 있다.
length()를 이용해 비밀번호 길이를 구하기substr()를 이용해 비밀번호를 이루는 문자 구하기
첫 번째 풀이 부분: length() 함수로 비밀번호 길이 구하기
쿼리문을 살펴 보면 아이디가 존재할 시에 Hello admin이 출력된다.
쿼리문과 or을 활용해 비밀번호 길이를 유추할 수 있다.
쿼리문에 ?pw=' or id='admin' and length(pw)<10 %23 을 입력하여 앞의 판별은 무시하고
비밀번호 길이가 10 미만일 때 성공 문구를 출력할 것이다.
위와 같이 성공 문구가 출력한 것으로 보아 비밀번호 길이는 10 미만이다.
파이썬 코드를 짜서 반복 구문을 통해 비밀번호 길이를 구할 수 있지만 코딩까진 아직 잘 모르겠어서
쿼리문에 대입하는 수의 범위를 줄여가며 비밀번호 길이가 8이란 걸 알 수 있었다.
( (pw) < 8 이 대입될 때부터 Hello admin이 뜨지 않았다.)
두 번째 풀이 부분: strsub() 함수로 비밀번호 구하기
- substr()
substr(string, start_index, length)
string : 추출의 대상이 되는 문자열
start_index : 추출을 시작하는 위치
length : 인덱스로 부터 추출할 문자의 개수 ( 값이 없으면 문자열의 끝까지 추출)
파이썬 모듈로 아스키 코드 48부터 127까지 하나씩 대입하여 인덱스까지 추출하는 코드를 자동화할 수 있다.
그 결과 비밀번호는 095a9852가 나온다.
파이썬 모듈로 코드 자동화 공부가 필요
'WebHacking > WarGame' 카테고리의 다른 글
[Dreamhack] Lv.2 DOM XSS (0) | 2023.11.07 |
---|---|
[Dreamhack] simple_sqli write-up (0) | 2023.10.10 |
[los.rubiya] goblin write-up (0) | 2023.10.10 |
[los.rubiya] cobolt write-up (0) | 2023.10.10 |
[los.rubiya] gremlin write-up (0) | 2023.10.04 |