los - succubus
·
Lord_of_SQL-Injections_I
처음으로 시간 좀 걸렸던 더러운 문제.... 입력할 수 있는 id, pw 모두 싱글 쿼테이션으로 포함되어 있지만, 필터링에서 (') 문자가 막혀 버린다. 이래나 저래나 어떤 값을 입력하던 모두 문자열로 인식되어 버리는 문제가 발생한다. 일단 클리어 조건을 보면 id 값이 존재하기만 하면 된다. 힌트는 문자열 내에서 특수 문자를 사용하는 법이다. 다음의 파이썬 예제를 살펴보자. > print "Hello My name is "succubus"" > 오류 난다. 왜냐하면 문자열의 의미하는 (") 안에 또 (")이 사용되었기 떄문이다. 위 같은 문장을 제대로 출력하려면 특수 문자를 써야한다. > print "Hello my name is \"succubus\"" > Hello my name is "succub..
los - zombie assassin
·
Lord_of_SQL-Injections_I
적절한 필터링과 함께, id와 pw 파라미터에서의 싱글 쿼테이션 사용 또한 제한되고 있다. 그리고 클리어 조건은 쿼리 결과 id 값이 존재만 하면 된다.(admin 이던 guest 이던 상관 없음) 사실 이 문제는 PHP의 버전 취약점도 내포한다. PHP 5.3 버전에서는 ereg 함수를 이용하여 문자열을 비교할 때 앞에 널문자가 포함되어 있으면 비교가 되지 않는다. 즉, " ' " 은 필터링이 되어도 " %00' " 은 필터링이 되지 않는다. http://localhost/zombie_assassin_eac7521e07fe5f298301a44b61ffeec0.php?id=%00%27%20or%20id%20LIKE%20%27%%27%23
los - assassin
·
Lord_of_SQL-Injections_I
필터링 부분이 확 줄은 대신에 쿼리에서 pw를 비교하는데 '=" 대신 "like" 연산자를 사용하고 있다. 그리고 쿼리 결과 내 id 값에 따라 "Hello guest", "Hello admin" 을 출력하고 있다. like 연산자에서 비교할 문자열은 정규식을 사용하여 비교하는 것이 가능하기 때문에 비밀번호 각 자리수마다 문자열을 대입해서 결과가 id='admin' 인 것을 뽑아내면 된다.