Wargame/bWAPP

bWAPP A1 SQL injection - Stored (Blog)

0xe82de_ 2020. 10. 28. 23:24
728x90
728x90
728x90
 

itsecgames.com

 

www.itsecgames.com

[사진 1]
[사진 2]

stroed 방식을 이용한 sql injection 문제이다.

 

low

[사진 3]

low 레벨이다. single quote와 문자열을 입력해보면 에러 결과 값으로 'test','bee')' 문자열을 확인할 수 있다. "bee" 문자열은 고정되어 있는 것으로 보이며 [사진 2]의 Owner 셀에 출력된다. 그렇다면 "bee" 문자열을 주석처리하고 그 앞에 sql 구문을 입력하면 될 것 같다.

 

[사진 4]

위와 같이 소괄호를 이용하여 sql 결과를 Owner 셀에 출력할 수 있다.

 

[사진 5]

위와 같이 information_schema 스키마의 tables 테이블을 이용하여 DB에 존재하는 테이블명을 확인할 수 있다.

qeury : test', (select table_name from information_schema.tables where table_schema != "information_schema" limit 0, 1))#

 

[사진 6]

또한, information_schema 스키마의 columns 테이블을 이용하여 특정 테이블의 컬럴명을 알아낼 수 있다.

 

[사진 7]

추가적으로 information_schema 스키마의 tables 테이블에서 테이블이 존재하는 스키마도 확인할 수 있다.

 

[사진 8]

이제 특정 테이블의 데이터를 select할 수 있다. 위 사진에서는 bWAPP 스키마의 users 테이블의 정보를 select했다. 위 게시판에서 새로운 데이터를 Add하면 blog 테이블이 업데이트 되는데, 이 과정에서 blog 테이블의 데이터를 select하면 에러가 발생한다(구글링을 해보니 우회하는 방법이 있다고 한다. 이 방법은 생략한다.).

 

medium

[사진 9]

medium 레벨이다. medium 레벨에서 single quote를 입력하면 앞에 backslash가 붙어서 업데이트된다. 서버에서 필터링을 하는 것으로 추측할 수 있다.

 

[사진 10]
[사진 11]

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

[사진 12]

high 레벨이다. high 레벨에서는 single quote 입력 시 backslash가 붙지 않고 일반문자로 업데이트되었다.

 

[사진 13]
[사진 14]

high 레벨에서는 mysqli_real_escape_string() 함수로 필터링을 하는데 mysql_real_escape_string() 함수와 다른 점은 backslash가 붙지 않고 이스케이프된다는 점이다. 따라서 backslash가 붙지 않고 일반 문자로 치환되며, SQL Injection 공격이 어렵겠다.

728x90
728x90