bWAPP A1 SQL injection - Stored (Blog)
itsecgames.com
www.itsecgames.com
stroed 방식을 이용한 sql injection 문제이다.
low
low 레벨이다. single quote와 문자열을 입력해보면 에러 결과 값으로 'test','bee')' 문자열을 확인할 수 있다. "bee" 문자열은 고정되어 있는 것으로 보이며 [사진 2]의 Owner 셀에 출력된다. 그렇다면 "bee" 문자열을 주석처리하고 그 앞에 sql 구문을 입력하면 될 것 같다.
위와 같이 소괄호를 이용하여 sql 결과를 Owner 셀에 출력할 수 있다.
위와 같이 information_schema 스키마의 tables 테이블을 이용하여 DB에 존재하는 테이블명을 확인할 수 있다.
qeury : test', (select table_name from information_schema.tables where table_schema != "information_schema" limit 0, 1))#
또한, information_schema 스키마의 columns 테이블을 이용하여 특정 테이블의 컬럴명을 알아낼 수 있다.
추가적으로 information_schema 스키마의 tables 테이블에서 테이블이 존재하는 스키마도 확인할 수 있다.
이제 특정 테이블의 데이터를 select할 수 있다. 위 사진에서는 bWAPP 스키마의 users 테이블의 정보를 select했다. 위 게시판에서 새로운 데이터를 Add하면 blog 테이블이 업데이트 되는데, 이 과정에서 blog 테이블의 데이터를 select하면 에러가 발생한다(구글링을 해보니 우회하는 방법이 있다고 한다. 이 방법은 생략한다.).
medium
medium 레벨이다. medium 레벨에서 single quote를 입력하면 앞에 backslash가 붙어서 업데이트된다. 서버에서 필터링을 하는 것으로 추측할 수 있다.
medium 레벨의 경우 addslashes() 함수로 필터링을 하고 있다. addslashes() 함수는 single quote, double quote, backslash, NUL 값을 필터링하는데, 앞에 backslash를 붙여서 일반 문자로 치환해버린다. 따라서 SQL Injection 공격이 어렵겠다.
* PHP addslashes() function
PHP: addslashes - Manual
spamdunk at home dot com, your way is dangerous on PostgreSQL (and presumably MySQL). You're quite correct that ANSI SQL specifies using ' to escape, but those databases also support \ for escaping (in violation of the standard, I think). Which means that
www.php.net
high
high 레벨이다. high 레벨에서는 single quote 입력 시 backslash가 붙지 않고 일반문자로 업데이트되었다.
high 레벨에서는 mysqli_real_escape_string() 함수로 필터링을 하는데 mysql_real_escape_string() 함수와 다른 점은 backslash가 붙지 않고 이스케이프된다는 점이다. 따라서 backslash가 붙지 않고 일반 문자로 치환되며, SQL Injection 공격이 어렵겠다.