이번 문제는 45번 문제와 유사한 문제이다.
코드를 보면
id, pw 둘 다 addslashes함수로 ', ", \, null을 필터링하고
foreach를 이용해 id와 pw 둘 다 from, pw, (, ), %, =, <, >, 공백을 필터링하고 있다.
또한, id만 union을 추가로 필터링하고 있다.
쿼리 출력값이 lv=3이면 문제는 풀린다.
우선 id쪽을 공략해 보자
addslashes는 멀티바이트를 이용하여 우회가 가능하고
id = 123%a1'%0bor%0blv%0blike%0b2%23&pw=123을 입력해 보면 (%0b -> 공백 우회)
level : 2가 출력되는 걸 볼 수 있다.
그럼 lv=3을 넣으면 바로 풀리지 않을까?
3을 넣으니 Wrong이 출력되는걸 볼 수 있다.
그러면 db에 lv가 3인 값이 없는 것으로 예상할 수 있는데 union을 이용해 컬럼을 합쳐 출력하면 될 것 같다.
하지만 id부분에 union이 필터링되어 있다.
여기서 생각해 볼게 항상 굳이 필요 없는 코드를 주시해야 한다.
왜 다른 필터링은 id와 pw 공통으로 해놓고 굳이 id부분만 따로 union을 필터링해놨을까?
pw 부분을 이용하라는 의도 같은데 pw는 md5함수 때문에 쿼리문을 넣기 쉽지 않다.
여기서 이용할게 주석인데 우린 항상 한 줄 주석(#)을 많이 사용했다. 하지만 mysql에는 #말고도 --와 /* */주석이 있는데
이번에 사용할 것은 /* */이다.
/* */는 해당 기호에 둘러싸인 부분을 주석으로 처리해 준다 (ex /* 안녕하세요 */ )
123%a1'/*&pw=*/%0bunion%0bselect%0b3%23를 입력하면
select lv from chall50 where id='123%a1'/*' and pw=md5('*/ union select 3#')
이런 형태로 주석처리가 되어 md5함수를 무시할 수 있다.
'Web > Webhacking.kr' 카테고리의 다른 글
Webhacking.kr Challenge old-35 문제 풀이 (0) | 2024.03.24 |
---|---|
Webhacking.kr Challenge RPG1 문제 풀이 (0) | 2024.03.22 |
Webhacking.kr Challenge old-8 문제 풀이 (0) | 2024.03.19 |
Webhacking.kr Challenge alien golf 문제 풀이 (0) | 2024.03.18 |
Webhacking.kr Challenge old-9 문제 풀이 (0) | 2024.03.15 |