2025. 1. 9. 17:27ㆍWeb Security/웹 해킹
php 세션에 사용자에 입력을 넣을 때 code excution 공격이 발생할 수 있다.
위 문제를 잘 설명하는 문제가 kaist의 GoN이라는 챌린지에서 나와서 한번 풀이도 적을겸 설명하고자 한다.
아래는 index.php 코드이다.
<?php
session_start();
$name = isset($_GET["name"]) ? $_GET["name"] : "Guest";
$_SESSION["name"] = $name;
$action = isset($_GET["action"]) ? $_GET["action"] : "greeting";
if ($action === "sleeping") {
$_GET["mode"] = $_GET["mode"] ? basename($_GET["mode"]) : "home.php";
}
switch ($action) {
case "greeting":
include "./include/greeting.php";
case "sleeping":
include "./include/".$_GET['mode'];
default:
include "./include/greeting.php";
}
?>
아래 코드는 greeting.php 코드이다
<?php
if ($name) {
echo "Hello!! $name";
die();
}
?>
index.php 코드를 잘 설명하기 위해서 key 포인트를 색깔 칠해왔다.
1. php session posing 공격이 발생되는 곳이 빨간색이다.
2. sanitizaion(필터링) 되는 곳이 파란색이다
3. case 문에 break가 없어서 Fallthrough 발생되는 곳이 초록색 부분이다. (위 처럼 처리를 적절히 하지 않아서 논리적 취약점이 발생 되는 예시로는 EAR(excution after rediraction) 취약점이 존재하니 궁금하면 찾아보길 바람)
1. php session posing 공격
아래 사진처럼 웹 사이트에 접속하면 계정에 맞게 세션을 설정해주고 세션의 정보를 저장한다. 세션의 정보는 메모리에 저장된다고 알고 있다. 하지만 영속성, 서버 재시작시 정보 유지 등의 이유로 파일로 저장시킨다.
위 사진을 예시로 들면 세션의 value 에 sess_을 더하여 파일 이름을 만들고 /var/lib/php/sessions/ 위치에 저장시킨다.
다시 문제로 돌아와서 , 아래 사진은 Burp 통해서 요청을 보냈을 생기는 세션이다. /var/lib/php/sessions/sess_khl0ir2rpucen1jopa4ac1ioqa 파일에 세션의 정보가 저장된다.
위처럼 index파일에 보내주게 되면 $_session['name'] = session_posioning 이라는 값이 저장되게 된다.
파일은 아래처럼 저장되어 있다.
그렇다면 <%3fphp+system($_GET['cmd'])%3b+%3f> 처럼 name을 보내주고, 세션 파일에 실행해주면, php 파일처럼 실행되면서, php 쉘이 실행된다.
그렇다면 php 파일처럼 실행시킬려면 어떻게 해야하는 걸까?
바로 include라는 함수의 특징을 이용하면 되는데 include 함수는 파일 경로의 확장자를 자동으로 확정하는 특징이 있다. 즉 php 파일이 아니더라도 php 파일이라고 인식하고 php 실행시킨다는 점이다. (참고로 include 함수가 있을 때 php wrapper을 통해서 파일 다운로드 공격이 가능하다 나중에 한번 확인해보셈)
2. using Fallthrough to bypass basename()
include "./include/../../../../../../../var/lib/php/sessions/sess_khl0ir2rpucen1jopa4ac1ioqa" 처럼 되어야지 세션 파일에 저장되 우리의 php 악성 쉘이 실행된다. 하지만 basename() 때문에 실제로는 include "./include/ sess_khl0ir2rpucen1jopa4ac1ioqa" 처럼 된다.
basename 필터를 우회해야 한다. Fallthrough 를 통해서 우회하도록 하겠다.
우회
1. $_GET['action'] = greeting 넣으면 아래 모든 case 및 default가 실행된다. 또한 action이 sleeping 아님으로 basename()이 실행되지 않는다.
1-2 아래는 greeting.php파일이다. 여기서 $name이 null 비어 있으면 die() 가 실행되지 않는다.
2. case sleeping이 잘 실행됨으로 include "./include/../../../../../../../var/lib/php/sessions/sess_khl0ir2rpucen1jopa4ac1ioqa"와 같이 파일 포함 시킬 수 있다.
3. FUll expoit
php 쉘을 세션 파일에 삽입
아래 response를 보고 잘 삽입되었다는 것을 확인할 수 있다.
세션파일에 있는 쉘코드 실행 및 readflag 실행
이에 대한 결과
참고자료
https://ctf.goatskin.kr/challenges
GoN 2025 Winter 1st Qual
ctf.goatskin.kr
https://medium.com/@YNS21/php-session-poisoning-using-lfi-36d7df012777
PHP Session Poisoning using LFI.
PHP Session Poisoning:
medium.com
'Web Security > 웹 해킹' 카테고리의 다른 글
Debug and vulns (0) | 2025.02.23 |
---|---|
ByPass WAF using HTTP header (0) | 2025.01.11 |
file upload & download & reverse shell (11) | 2024.11.15 |
blind sql injection (1) | 2024.10.29 |
sql injection CTF vs real world. finger print (0) | 2024.10.27 |