반응형
1. PHP strcmp() 취약점
- PHP 5.3 이상, 8.0 미만의 버전에서의 strcmp()은 인자 값을 배열 타입의 데이터를 전달하면 NULL을 반환하는 취약점 발생
if (strcmp($_POST['password'], $password) == 0) {
echo "Congratulations! Flag is <b>" . $FLAG ."</b>";
exit();
} else {
echo "Wrong password..";
}
- 즉, password[] = "asdf" 와 같이 post 값을 배열로 준다면 NULL == 0 이 되기 때문에 FLAG를 출력
- 버프 슈트로 post 값을 다음과 같이 변조
password[]="asdf"
2. Linux Apache htaccess 취약점
- /etc/apache2/apache2.conf 파일에 AllowOverride가 All 로 설정되어 있다면 .htaccess 파일을 통해 취약점 발생
- 서버 오류가 나온다면 대부분 htaccess 설정이 All로 되어 있는 상태임을 짐작 가능
- .htaccess 의 주요 공격 페이로드는
- php_flag engine off : php의 엔진을 다운시켜 php의 소스코드를 그대로 노출
- AddType application/x-httpd-php txt :txt 파일을 php로 실행시킴 (txt 자리에는 파일 확장자가 들어감), 웹셀 공격 가능
- 파일 업로드를 통해 다음과 같은 .htaccess 파일을 업로드
# .htaccess
AddType application/x-httpd-php txt
3. REMOTE_ADDR 취약점
- 다음과 같이 리눅스 명령어 echo 를 통해 클라이언트 IP를 출력해주는 웹사이트가 있음

- X-Forwarded-For 헤더를 통해 클라이언트 IP를 조작할 수 있고, Command Inectjion 까지 가능한 환경임
X-Forwarded-For: 1.1.1.1; cat ../flag
4. NoSQL 기반 CouchDB 취약점 (express)
- uid와 upw를 받아 로그인 해주는 페이지

- couch 객체가 담긴 users의 get 메서드를 통해 uid를 받아옴
users.get(req.body.uid, function(err, result) {
if (err) {
console.log(err);
res.send('error');
return;
}
if (result.upw === req.body.upw) {
res.send(`FLAG: ${process.env.FLAG}`);
} else {
res.send('fail');
}
});
- 그러나 get은 couchdb에서 특정 반응을 일으키는 문자에 대한 필터링을 진행하지 않음
- uid에 _all_docs 을 입력하여 json 형식으로 데이터베이스의 document를 출력
- 모든 document가 출력되기 때문에 upw라는 필드는 존재하지않음
- result.upw는 undefind가 되고, upw도 html 태그를 수정하여 undefind를 만들면 FLAG를 출력
5. PHP 타입 변환 연산자 취약점
- 다음과 같이 id와 pw를 입력 받아 서버 내부에 저장된 id와 pw를 비교하는 코드가 있음
$id = getRandStr(); #'RANDOM 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
$pw = sha1("1"); // 356a192b7913b04c54574d18c28d46e6395428ab
$input_id = $_POST["input1"] ? $_POST["input1"] : "";
$input_pw = $_POST["input2"] ? $_POST["input2"] : "";
sleep(1);
if((int)$input_id == $id && strlen($input_id) === 10){
echo '<h4>ID pass.</h4><br>';
if((int)$input_pw == $pw && strlen($input_pw) === 8){
echo "<pre>FLAG\n";
echo $flag;
echo "</pre>";
}
} else{
echo '<h4>Try again.</h4><br>';
}
}
- 비교 연산자를 보면 int로 변환시켜 비교해주는 데, 여기서 취약점이 발생
- PHP에서의 str을 int로의 타입 변환은 "1234" 와 같은 정수를 변환해준다는 것을 의미함
(int)"12345" #123456
(int)"asdf12345" #0
(int)"12345asdf" #12345
(int)"asdf" #0
- 또한 int로 타입 변환을 시켜준 변수 $input_id와 비교 대상인 $id도 똑같이 int 타입 변환을 시켜 비교를 실행시킴
- 다음과 같이 입력하면 FLAG을 출력함
input_id="0000000000"
input_pw="325aaaaa"
6. SQL CHAR 취약점
- SQL에서 CHAR은 VARCHAR 타입과는 다르게 공백까지 같이 데이터로 저장시킴
- 또한, 예를 들어 입력 값이 CHAR(32)에서 크기를 넘어간다면 그 뒤에 입력된 데이터는 자름
- 회원가입을 하는 과정에서 admin이라는 계정이 이미 존재한다면 다음과 같이 우회를 할 수 있음
id: admin 00000
pw: admin!!
- 즉, admin이라는 계정이 있는지 비교를 할 때는 " admin 00000" 이라는 입력 값과 비교하지만, sql에 삽입이 될 때는 33번째 문자열부터는 잘라서 저장하기 때문에 쿼리가 정상적으로 작동됨
- 또한 INSERT안에서 SELECT 쿼리 문을 실행할 수 있음
INSERT INTO user(id, name, pw) VALUES('aa', 'bb', (select pw from user where id='admin')) --', {name}, {pw})
반응형
'IT Dictionary > CTF & 보안' 카테고리의 다른 글
| CTF 2일차 (0) | 2026.01.20 |
|---|---|
| CTF 1일차 (0) | 2026.01.19 |