우리는 저번 시간 훌륭하게 사악한 마법사를 물리치고, 용 3형제를 만나게 되었다. 그중 첫 번째 용인 Green Dragon을 만나보자
* 초록색 용도 이미지가 없다. 대신귀 여운알 파카를 드리겠 습니다.
코드
파라미터로는 id와 pw를 받아들이는 거 같고, 정확한 pw를 알 필요는 없지만 첫 번째 쿼리가 실행된 결과에 대해서 두 번째 쿼리를 실행해서 이중으로 검사를 하는 거 같다.
해결방법
Answer Url : los.rubiya.kr/chall/green_dragon_74d944f888fd3f9cf76e4e230e78c45b.php?id=\&pw=%20union%20select%200x5c, 0x756e696f6e2073656c65637420636861722839372c3130302c3130392c3130352c313130292d2d203b--%20;
파라미터가 끔찍하지 않은가 지금부터 이유 들어간다. 타당한 이유부터 한 단계 한단계 밟아보자
1. 코드로 진입하기 위해서 이스케이프 문자열을 활용해 보았다. (즉 id='{$_GET [id]}' and pw='{$_GET [pw]}'를 id의 끝나는 작은따옴표를 이스케이프 시켜 GET [pw]의 종료 작음 따옴표까지 문자열 처리하겠다는 것이다.
2. 또한 코드의 $result를 받아오는 부분을 보면, id와 pw가 있어야 되는 것을 확인할 수 있다. id에 'admin'을 주고 pw는 일단은 아무 문자(예시에서는 "1"을 썼다.)를 넣어 쿼리를 때려보자, 작은따옴표가 필터링되어있으니, 헥스값을 써주거나 char함수로 우회해보자
시도 :? id=\&pw=%20 union%20 select %20 char(97,100,109,105,110)--%20;
GOOD TRY! query2가 출력되는 단계까지 진입하였다. 다음은 query2에 들어갈 파라미터 부분이다.
3. query2 또한 query1처럼 id의 작은따옴표를 이스케이프 시키고, pw에 union을 하면될 거 같다.(query1은 id와 pw가 둘 다 query2의 실행에 사용되어 필수였지만, query2의 결과는 id만 검사하기 때문에, union select 'admin'만 제대로 들어가면 된다.)
잘못된 시도 : ?id=\&pw=%20union%20select%20%5C,union%20select%20%5C,char(97,100,109,105,110)--%20;
허허... 될 리가 없다. 우리는 이미 query1에서 코드 부분으로 들어갔기 때문에 union이나 select나 char나 의미 있는 문자열이 해석이 되어버렸다. 이는 우리의 코드를 헥스값으로 변환함으로 해결할 수 있다.(아래 사이트 참조)
* 헥스값 변환 사이트 : www.branah.com/ascii-converter
잘한 시도 : ?id=\&pw=%20union%20select%200x5c,0x756e696f6e2073656c65637420636861722839372c3130302c3130392c3130352c313130292d2d203b--%20;
축하한다.
생각보다 난제였던 Green Dragon이었다. 실제로 숙련된 SQL Injection attacker는 이보다 보다 보다 보다 훨씬 어려운 코드를 짠다. 필자도 그들의 반의 반이라도 닮을 수 있도록 노력하는데, 잘 안된다. 다음 관문에서 기다리겠다.
'WarGame > Lord of SQL Injection' 카테고리의 다른 글
[LOSI] Lord of SQL Injection Level 27 - Blue Dragon (0) | 2021.04.23 |
---|---|
[LOSI] Lord of SQL Injection Level 26 - Red Dragon (0) | 2021.04.22 |
[LOSI] Lord of SQL Injection Level 24 - Evil Wizard (0) | 2021.04.21 |
[LOSI] Lord of SQL Injection Level 23 - Hell Fire (0) | 2021.04.21 |
[LOSI] Lord of SQL Injection Level 22 - Dark Eyes (0) | 2021.04.20 |