Wargame.kr login_fillter문제
첫번째 포스팅으로 login_filter를 한다. 왜냐면 기억해두고 싶은게 있어서
분석하여 쓸것은 아니고 어떤 요소가 이 문제를 푸는데에 쓰이는지만 적어보겠다.
바로 Php는 대,소문자를 구분하지만, 쿼리는 (mysql) 구분하지 않는다는 것이다.
처음에는 mysql_real_escape_string(trim($_POST['id'])); 이것에 꽃혀서 나오지를 못했으나, 나중에 그것도 롸업을 보고 알게 되었다. 그렇지만, mysql_real_escape_string함수에 대해 알고 우회방법까지 알 수 있는 계기가 되어 좋았다.
좀더 부연설명 해보자면, mysql_real_excape_string함수는 sql injection을 막기위해 '등과 같은 문자앞에 \를 넣어 구분하게 해주는 함수이다.
여기서 취약점은
1. php는 멀티바이트를 이용한다.
2. mb_convert_encoding함수는 인코딩을 할 때 쓰이는 함수 이며, 언어를 한국->일본, 중국->한국 등 다른나라 언어로 바꿀 때 사용된다.
출처: http://dydgh499.tistory.com/32 [Creating my everything]
이 함수를 이용할때 취약점이 발생한다.
멀티바이트를 사용하는 언어셋 환경에서는 백슬래시 앞에 %a1~%fe의 값이 들어오면 인코딩이 깨지면서 백슬래시를 덮어씌어버려서 2바이트의 멀티바이트를 하나의 문자(1바이트)처럼 표현이 되는 취약점이 있다.
예를들어 addslashes함수나 mysql_real_escape_string함수에 0x27(')이 들어가게 되면 0x27앞에 백슬래쉬를 붙여준다. 즉 0x5c27(\')이 된다. 여기서 %a1~%fe의 값이 들어오면 백슬래쉬를 먹어버린다고 했으니 0xa15c27을 삽입하면 '만 남개된다.
이로써 우회가 가능하다고 볼 수 있다.
출처: http://dydgh499.tistory.com/32 [Creating my everything]
그렇다고 한다.
그리고 이 모든내용은
http://rootable.tistory.com/entry/addslashes-mysqlrealescapestring-%EC%9A%B0%ED%9A%8C
에서 왔다.