Webhacking.kr Challenge 7 풀이.
첫 화면이다. auth를 눌렀더니 아래와 같다.
url을 보면 val=1라는 값이 전달되고 있다.
일단 소스 보기를 누른다.
별 거 없고, admin mode는 var 값이 2라는 사실과 index.phps를 볼 수 있다는 것을 알 수 있다.
일단 var=2를 입력.
위와 같은 화면이 등장. 그리고 index.phps를 봐본다.
일단 db에는 val=2가 존재하지 않는 사실과 union을 이용하라는 말이 있다.
union은 일단 간단히 말해 둘 이상의 쿼리를 하나의 결과로 출력해 사용하는 명령어.
val이라는 변수를 get으로 받고, 그 값을 go라는 변수에 집어넣고 있다.
<? 아래 부분을 보면 변수 go는 꼭 데이터가 존재해야 하며, go안에 값이 없다면, 다시 index.php로 넘어간다.
go에 값이 있다면, ck라는 변수에다가 go 변수의 값을 집어넣는데, 다시 ck 값의 *와 / 기호를 str_replace 함수를 이용해 없애고 있다.
if(eregi ~~~~~~)
if(eregi ~~~~~~)
이 부분을 보면 eregi 함수를 통해 각종 키워드를 ck변수로부터 차단한다. 공백이라도 차단.
맨 위에서도 말했듯이 union은 차단하지 않고, 공백은 url 인코딩에 의해 %0A로 우회.
if($rand==1) ~~~if($rand==5)
변수 rand라는 값은 1,2,3,4,5, 중 아무거나 랜덤 값으로 들어가고 있는 상황.
if 밑에 코드에서 이 rand값이 괄호의 개수라고 보면 된다.
즉 rand 값이 K[1이상 5이하의 자연수] 일 때의 상황, 똑같은 쿼리를 문제가 풀릴 때까지 여러 번 시도해야 한다.
rand 값이 1일 때부터 시작하겠다. 일단 union 전 쿼리는 거짓이 나와야 하므로,
?val=-1) union select (2 입력.
안 된다. ?val=1) union select (2 라는 쿼리는 공백이 있고, 2라는 문자까지 필터링하고 있어서, 차단되고 있다.
필터링을 우회해줘야 한다. 일단 공백, 즉 스페이스바가 %20으로 들어가는데, linefeed %0A로 대체하고, 위에서도
필터링에서 +와 *도 거르는 상황이니, 뺄셈으로 2를 만들어주면 된다. 2는 => 3-1로 대체.
서버가 터진 거 같다.. 나중에 된다면 추가로 다시 해보겠다.
'# Related site issues > WEBHACKING.KR' 카테고리의 다른 글
Webhacking.kr Challenge 3. (0) | 2018.05.12 |
---|---|
Webhacking.kr Challenge 5. (0) | 2018.05.12 |
Webhacking.kr Challenge 11. (0) | 2018.05.12 |
Webhacking.kr Challenge 47. (0) | 2018.05.11 |
Webhacking.kr Challenge 42. (0) | 2018.05.06 |