반응형

네 페이지 소스보시죠...


<?php
  
include "../../config.php";
  if(
$_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 7</title>
</head>
<body>
<?php
$go
=$_GET['val'];
if(!
$go) { echo("<meta http-equiv=refresh content=0;url=index.php?val=1>"); }
echo(
"<html><head><title>admin page</title></head><body bgcolor='black'><font size=2 color=gray><b><h3>Admin page</h3></b><p>");
if(
preg_match("/2|-|\+|from|_|=|\\s|\*|\//i",$go)) exit("Access Denied!");
$db dbconnect();
$rand=rand(1,5);
if(
$rand==1){
  
$result=mysqli_query($db,"select lv from chall7 where lv=($go)") or die("nice try!");
}
if(
$rand==2){
  
$result=mysqli_query($db,"select lv from chall7 where lv=(($go))") or die("nice try!");
}
if(
$rand==3){
  
$result=mysqli_query($db,"select lv from chall7 where lv=((($go)))") or die("nice try!");
}
if(
$rand==4){
  
$result=mysqli_query($db,"select lv from chall7 where lv=(((($go))))") or die("nice try!");
}
if(
$rand==5){
  
$result=mysqli_query($db,"select lv from chall7 where lv=((((($go)))))") or die("nice try!");
}
$data=mysqli_fetch_array($result);
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);
}
?>
<a href=./?view_source=1>view-source</a>
</body>
</html>

val값이 없으면 val=1로 이동

preg_match("패턴","검색 대상")함수는 정규식 표현 일치 여부를 확인합니다.


정규식 참고

https://soooprmx.com/archives/7718


/2|-|\+|from|_|=|\\s|\*|\//i

| |로 구분되고 

2,-,+,from,_,=,

\\s(공백)

\*(곱하기)

\/(나누기)

대소문자 구분안함.


위 조건들을 피해서 val값의쿼리를 작성해야한다.


그뒤로 랜덤한 수를 생성하여 select lv from chall7 where lv=($go)라는 쿼리를 보내고 받은 데이터를 저result에 담아 그것이 2인지에 대한 여부를 확인하는것으로 보인다.(괄호의 개수에 따라 쿼리가 달라질거같다. 가장 간단한 1개짜리를 공략하자 혹시나 다른숫자를 원한다면 0뒤에 벨류값에 괄호를 추가하면 될것이다 굳이...)


디비로 부터 2라는 데이터를 받아와야 한다는 말인데 기본적으로 2를 포함해 기본연산으로는 2를 만들수 없게 만들어놨다. 우리는 union select(2 를 넣어서 찾고 2라는값을 받아오고 싶은데 공백과 2라는것이 걸린다.


sql 연산함수를 대충 찾아보았다.

2하면 떠오르는게 4의 제곱근 sqrt 함수를 사용해봤다.


 or die()함수는 단순히 에러가 발생하였을 때 해당 스크립트를 종료시키고 개발자가 의도한 메시지를 출력하게 해주는 함수인데 --는 필터링이 되어있으니 주석처리를 이용하였다.


val=1이나 2가 아닌값으로 하여 필터링과 값이 나오지 않도록 처리해준다.


https://webhacking.kr/challenge/web-07/index.php?val=0)UNION(SELECT(sqrt(4))#)



이렇게 해주면 성공





반응형

'보안 > webhacking' 카테고리의 다른 글

webhacking.kr old-09  (0) 2019.11.23
webhacking.kr old-08  (0) 2019.11.23
webhacking.kr old-06  (0) 2019.11.23
webhacking.kr old-05  (0) 2019.11.22
webhacking.kr old-04  (0) 2019.11.22
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기