D1N0's hacking blog
Lord of SQL injection - Gremlin 본문
들어가기 전에
이 글은 기본적인 SQL injection에 대해 다룬다
php나 SQL 같은 웹에 대한 지식이 아예 없다면 간단히라도 공부하고 읽는 것을 추천한다
SQL 인젝션이란?
SQL 삽입(영어: SQL Injection, SQL 인젝션, SQL 주입)은 응용 프로그램 보안 상의 허점을 의도적으로 이용해, 악의적인 SQL문을 실행되게 함으로써 데이터베이스를 비정상적으로 조작하는 코드 인젝션 공격 방법이다. [위키백과]
간단히 말해 사이트 내에서 sql 쿼리를 사용하는 부분의 취약점을 이용해서 데이터베이스를 조작하는 웹 해킹 기법을 말한다
Lord of SQL injection(이하 los)는 Rubiya님이 운영하는 워게임 사이트로, 다양한 SQL 인젝션 공격을 실습해볼 수 있다
문제 풀이
Gremlin 문제에 들어가면 다음과 같은 모습을 볼 수 있다
코드를 보면 get방식으로 id와 pw를 받아서 prob_gremlin에 id, pw가 일치하는 열을 가져오고,
그 id를 result에 저장하는 것 같다
언뜻 보면 아무 이상 없어 보이지만, SQL injection 취약점이 존재한다
위 코드에서 id가 쌩으로 query에 들어가기 때문에 id가 '[임의의 문자열] 이라면 쿼리문은
select id from prob_gremlin where id=''[임의의 문자열]' and pw=''이 되어 sql 쿼리를 마음대로 조종할 수 있다
그러면 이제 이를 활용해 문제를 풀어보자
los는 solve() 함수가 실행되면 레벨이 클리어 되는데, 이번 문제에서는 id와 pw가 일치하는 열이 있을 때 solve()가 실행된다
그러나 우리는 id와 pw를 모두 모르기 때문에, 아까 보았던 SQL injection을 이용해야 한다
첫 번째 풀이
id=' or 1=1;%23
이렇게 쓰면 쿼리가 select id from prob_gremlin where id='' or 1=1;#' and pw=''가 된다
#은 SQL의 주석처리 기호이므로 pw검증은 실행되지 않고 id='' or 1=1만 남는데,
id=''인 행은 없겠지만 or로 묶인 1=1은 참이므로 테이블 맨 위의 행을 넘겨주고, 인증에 성공한다
참고로, url에서 #을 쓸 수 없기 때문에 url encoding으로 우회해서 %23으로 쓴다
두 번째 풀이
pw=' or '1' = '1'
이렇게 쓰면 쿼리가 select id from prob_gremlin where id='' and pw='' or '1' = '1'가 된다
SQL에서 or보다 and가 먼저 연산되기 때문에, 역시 참을 반환한다
'Web > Lord of SQL injection' 카테고리의 다른 글
Lord of SQL injection - Darkelf (0) | 2020.11.11 |
---|---|
Lord of SQL injection - Wolfman (0) | 2020.11.11 |
Lord of SQL injection - Orc (0) | 2020.11.10 |
Lord of SQL injection - Goblin (0) | 2020.11.10 |
Lord of SQL injection - Cobolt (0) | 2020.11.10 |