-
SQL-Injection (2) 정리 (from_rubiya.kr)Web 2020. 3. 20. 01:14
<?php include "./config.php"; login_chk(); $db = dbconnect(); if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); if(preg_match('/ /i', $_GET[pw])) exit("No whitespace ~_~"); $query = "select id from prob_wolfman where id='guest' 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 {$result[id]}</h2>"; if($result['id'] == 'admin') solve("wolfman"); highlight_file(__FILE__); ?>
를? 이용한 sql 인젝션 취약점 공부를 시작하자.
우선 preg_match를 보면 https://www.php.net/manual/en/function.preg-match.php
다 보았다 생각 하에 whitespace 즉 띄어쓰기를 막아놔서 %0a(tab)으로 대체해서 얻어갈 것이 무엇인지 공부를 해보겠습니다
우선 result['id'] 즉 get방식으로 들어오는 id 가 admin 이어야 합니다. 근데 이미 id = guest로 지정되어져 있고 우리는 여기서 바로 sql 인젝션 공격을 해야한다는 것을 짐작? 해야 합니다(비밀번호는 인증에 없기 때문에)
우선 저번에 봤던 참,거짓을 통해 참or거짓 = 참 으로 만들어야 하기에 pw에 들어가야 할 파라미터를 조작해야 합니다.
아래는 정답(보기 전에 한번 실습을 해봅시다)
더보기?pw=admin%27or%0aid=%27admin%27%09or%09pw=%271=1%09
여기에서 정답만 확인하고 넘어가면 좋겠지만,, 왜 이런 값이 나오는지 원리를 이해하기 위해 조금 더 깊이 코드를 넣어보겠습니다.
더보기pw=admin%27or%0aid=%27admin%27%09and%09pw=%271=1%27%09or%09%271=1
우선 여기에서 제가 확인했던 점은 sql 인젝션을 발생시켜도 admin계정으로 로그인이 되지 못해 클리어를 하지 못했다는 점.
이것을 보았을 때
$result=mysql_fetch_array($re) <----이 부분에서 result['0']은 컬럼의 첫번 째를 가르키고 있다는점.
이 부분의 의아해서 가상으로 여러번 돌려봤습니다.
result['id']로 선언을 하였을 때 일반 배열로 선언을 하였을 때 while문을 돌렸을 때 결과값(왼쪽) 이 세가지 조건을 보면 첫번째에서 sql구문의 id 값이 php에서 인식을 해서 출력을 했다는 것이 보입니다(이게 아니면 댓글로 설명 부탁드립니다...저도 이건 모르겠습니다.)
두번째, 세번째 사진을 보시면 쉽게 이해가 가실 겁니다. 실제 db상태는 이렇습니다.
DB상태 여기에서 (1)에서의 내용을 보충 하자면 admin' or' 1=1 처럼 공격을 한다 해도 admin으로 공격이 되는것이 아니라 첫 번째의 데이터 값으로 로그인이 된다는 것을 확인 할 수 있습니다.
여기서 첫 번째 값은 guest였었나 보네요
되짚어 보자면
(id='guest' and pw='admin')-->거짓or(id='admin' and pw='1=1')-->거짓 ==거짓 or ('1=1')-->참 고로
거짓or참=참 이 guest 되겠습니다.
'Web' 카테고리의 다른 글
웹 취약점 별 어떻게 공격해야 할까? (0) 2020.12.20 SQL Injection 정리 3 (0) 2020.12.18 XSS - 정리 Reflected (1) (0) 2020.07.09 Zh3r0 CTF - WriteUp (0) 2020.06.17 SQL-Injection 정리(1) (1) 2020.03.19