[los - SQL injection] troll ( 8단계 )
[ 풀이과정 ]
troll은 if($result['id'] == 'admin') 조건을 만족해야 solve("troll");가 실행되면서 문제가 풀린다.
다만, 이 문제를 풀기전에 코드를 전체적으로 보면 if(preg_match('/\'/i', $_GET[id])) exit("No Hack ~_~");와
if(@ereg("admin",$_GET[id])) exit("HeHe"); 코드가 있어서 싱글 쿼터를 이용할 수가 없고
admin이라는 문자를 입력 할 수가 없다...
싱글 쿼터를 없애서 참/거짓을 판단하고 sql 인젝션을 시도하려고 해도 싱글 쿼터로 감싸져 있기 때문에
다른 SQL 함수들의 기능이 동작하지 않고 문자열로만 출력이 됬다.
그래서 다른 방법을 찾아보다가 https://dev.mysql.com/doc/refman/5.5/en/string-literals.html에서 방법을 발견했다..
SQL에서는 싱글 쿼터로 감싸져 있어도 '\' 문자를 해당 문자열 사이에 작성하면
문자를 잘라서 입력하는것과 같은 기능이 있다.
그래서 이 기능을 이용해서 id='ad\min'과 같이 입력을 하면 php에서는 \가 문자로 인식되 'ad\min'으로 인식하지만
SQL에서 동작할때는 \는 문자가 아닌 하나의 기능으로 인식이 되기 때문에
php 패턴 매칭에서 admin이라는 필터링도 피할수 있고 id에 admin 값을 입력 할 수가 있었다.
해당 방법을 몰라서 오래 고민을 했는데 의외로 답은 간단하였다..
SQL에 대해서 더 잘 알고 있었다면 금방 방법을 찾아낼수 있는 문제였다...
select id from prob_troll where id='ad\min'
- 문자열 필터링
- ereg() 함수 취약점, 대소문자
물론 이방법 외에도 ereg() 함수의 취약점을 이용하거나 대소문자를 이용해서 문제를 풀어낼수도 있고
그외에도 방법은 더 있을수 있다..
SQL 전체적인 인프라에 대한 이해가 필요함을 느끼게 해주는 문제였다.. 더 공부해야된다..
8단계 클리어~~
'워게임 > LOS' 카테고리의 다른 글
[los - SQL injection] skeleton ( 10단계 ) (0) | 2017.09.23 |
---|---|
[los - SQL injection] vampire ( 9단계 ) (0) | 2017.09.23 |
[los - SQL injection] orge ( 7단계 ) (0) | 2017.09.23 |
[los - SQL injection] darkelf ( 6단계 ) (0) | 2017.09.23 |
[los - SQL injection] wolfman ( 5단계 ) (0) | 2017.09.23 |
댓글