Lord of sql injection - green dragon 풀이 |
이제 풀다보니 dragon 까지 나오는군.... 그린 드래곤을 해치워보자
문제 접근
테이블이 출력되던 이전 문제들과 다른 문제 방식으로 변형됐다. 음 .. 필터링을 살펴보자
if(preg_match('/prob|_|\.|\'|\"/i', $_GET[id])) exit("No Hack ~_~"); if(preg_match('/prob|_|\.|\'|\"/i', $_GET[pw])) exit("No Hack ~_~"); |
싱글 쿼터에 제한을 두는게 보인다. 특이한점은 모르겠다. 일단 코드를 봤을때 id에 '를 넣고 뒤에 pw를 무력화 시키는 코드를 작성하는 방식처럼 보이는데 그렇게하면 두번째쿼리에서 id가 admin이 되는게 불가능하므로, 어떤식으로 접근해야하는지 잘 생각이 안났다. 그래서 힌트를 얻고자 검색을 했다.
먼저 싱글쿼터를 무력화 시키는 방법으로 \를 사용한다.
?id=\&pw=or 1=1%23 |
이렇게 쿼리가 주어진다면
query : select id,pw from prob_green_dragon where id='\' and pw='or 1=1#' |
id가 다음과 같이 들어가고 뒤에 or 1=1 때문에 항상 true가 된다. 근데 아무런 select 된 id,pw가 없다. 때문에
union select를 떠올려야하는 것이다
union select는 서로 다른 테이블에서 얻어온 칼럼을 하나의 단일 집합으로 만들어 주는 키워드이다.( 단 이때 불러오는 컬럼의 개수는 동일해야한다)
즉 prob_green_dragon 테이블이 비어있기때문에.. union select를 이용해서 값을 select해서
query 2에 id와 pw를 넣어줘야한다.
예를 들어
?id=\&pw=union select 1,2%23 |
와 같은 쿼리를 넣으면
query : select id,pw from prob_green_dragon where id='\' and pw='union select 1,2#' |
id 값으로 \' and pw= 가 삽입되고, ( 빈 테이블이므로 값이 추출되지는 않는다)
union select 1,2 가 적용되면서 id와 pw 컬럼에 1,2가 들어가게 되는것이다. 그래서 두번째 쿼리에 다음과 같은 결과가 출력된다.
여기까지 이해했다면, 이제 목표는 정해졌다. 첫번째 쿼리의 pw 입력에 union select를 이용해서
두번째 쿼리의 id를 무력화시키고 ( 어차피 빈 테이블이므로), pw에 union select를 통해 admin id를 select하면 해결될 것이다.
?id=\&pw=union select \,union select char(97,100,109,105,110)#' |
위의 코드로 하면 될 것 같았는데 안돼서 검색해보니 아스키 코드 값으로 변환해서 넣어야한다고 한다. ( 왜지 .?)
그래서 최종적인 변환쿼리는 다음과 같다.
?id=\&pw=union select 0x5c,0x756e696f6e2073656c6563742030783631363436643639366523%23 |
조금 찝찝하지만 .. clear !!
'개인 공부 > WEB' 카테고리의 다른 글
[웹해킹] LOS 27 - (Blue Dragon) (0) | 2021.07.03 |
---|---|
[웹해킹] LOS 26 - (Red Dragon) (0) | 2021.07.03 |
[웹해킹] LOS 24 - (Evil_Wizard) (0) | 2021.07.03 |
[웹해킹] LOS 23 - (Hell_Fire) (0) | 2021.07.03 |
[웹해킹] LOS 22 - (Dark_eyes) (0) | 2021.07.03 |
댓글