[Lord of SQLInjection]cobolt write up

zzsla·2023년 6월 7일
0

문제 정보

없다

문제

문제에 들어가면 위에 query와 sql명령문이 적혀있고 아래 코드가 나와 있다.

분석

id와 pw 값에 prob, _, ., () 이 들어가면 프로그램이 죽어버린다. 즉 저 값들이 필터링이 되어 있다.

  if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); 
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");

그 다음 query가 나오는데 sql 명령문이다.
sql 명령문은 id를 찾는데 prob_cobolt라는 테이블에 있어야 하고, id는 get으로 요청한 id이고, pw는 get으로 요청한 pw값에 md5로 암호화되어야 한다.

  $query = "select id from prob_cobolt where id='{$_GET[id]}' and pw=md5('{$_GET[pw]}')"; 

그리고 id값이 admin이면 문제가 풀린다.
만약 admin이 아닌 다른 값이면 hello (id값) You are not admin :( 이라고 출력된다.

  if($result['id'] == 'admin') solve("cobolt");
  elseif($result['id']) echo "<h2>Hello {$result['id']}<br>You are not admin :(</h2>"; 

취약점

필터링이 있지만 이것도 sql injection을 이용하면 문제를 풀 수 있다.

익스플로잇

일단 id값이 admin이여야 문제가 풀리기 때문에 id값에 admin을 넣어줘야 하고, pw값은 md5로 암호화가 되기 때문에 원하는 값을 넣을 수 없다.
그래서 id의 뒤 부분을 -- -로 주석처리한다. 그렇게 하면 id가 admin인 값을 찾을 수 있게 되면서 문제가 풀리게 된다.
/?id=admin' -- -

익스플로잇을 넣었을 때 실행될 sql query

 select id from prob_cobolt where id='admin' -- -' and pw=md5('')
profile
[README]newbi security hacker :p

0개의 댓글