wargame : https://webhacking.kr/
✔️ 문제
문제는 다음과 같다.
✔️ 풀이
auth 버튼을 누르면 access_denied가 반겨주기 때문에
바로 소스를 한번 살펴보자.
php로 작성된 코드에서는 2, -, +, from, _, =, \s, *, /에 대한 필터링이 보이고
rand 함수로 작성된 조건문이 보인다. 여기서 Hello admin이라는 alert를
띄우는 구문과 풀이는 다음 코드로 보여진다.
if(!$data[0]) { echo("query error"); exit(); }
if($data[0]==1){
echo("<input type=button style=border:0;bgcolor='gray' value='auth' onclick=\"alert('Access_Denied!')\"><p>");
}
elseif($data[0]==2){
echo("<input type=button style=border:0;bgcolor='gray' value='auth' onclick=\"alert('Hello admin')\"><p>");
solve(7);
}
다음 코드를 보면 쿼리 에러를 발생시켜주는 부분이 있고,
data[0] == 2 라는 값이면 Hello admin을 띄우는 것으로 보인다.
문제에서 나온 페이지는 val=1일 때의 페이지이고,
val가 2일때의 접근 거부,
val가 3일때는 쿼리에러를 노출한다.
만약에 val에 싱글쿼터가 삽입된다면?
nice try! 라는 것이 뜨게 된다.
우리는 해당 val 변수에 2라는 값을 넣을 수 있도록 해야한다.
예를 들면 1+1 또는 3-1 같은 값인데 해당 문자들은 필터링 되어있다.
그렇다면 LOS에서 푼 문제처럼
앞 쿼리를 무력화시킬 수 있는 union select 구문을 활용해보자.
참고로 공백은 %20이 들어가는데 2가 필터링 되기 때문에
괄호를 사용하도록 하자.
또한, ascii 코드에서 2를 의미하는 50을 char 함수로 보내어
쿼리에서 검색해보도록 하자.
3)union(select(char(50)))%23
val이 1과 2가 아닌 3부터 query error 였으므로 우선 3을 주고
해당 구문을 삽입하고나서 여러번 새로고침을 하게 되면,
어느순간 풀리는 것을 확인할 수 있다.
rand 함수 때문에 rand 1에 들어가야하는 쿼리문이 다른 곳에
삽입되면 무용지물이기 때문에 해당 1이 되기위해서 여러번 새로고침을 해준다.
이 외에도 +, -, / 연산 필터링에 걸리지 않은 % 나머지 연산을 이용할 수 있는데,
char(50) = 2 였던 것처럼,
10%4 = 2 같은 방식으로도 대입할 수 있다.
화이팅 💪
'보안 > wargame' 카테고리의 다른 글
[webhackingkr] old-06 (0) | 2023.01.06 |
---|---|
[webhackingkr] old-05 (0) | 2023.01.06 |
[webhackingkr] old-04 (0) | 2023.01.05 |
[webhackingkr] old-03 (0) | 2023.01.04 |
[webhacking.kr] old-02 (0) | 2023.01.03 |