dreamhack.io의 문제들입니다.
개발자 도구의 Sources 탭 기능을 활용해 플래그를 찾아보세요.
플래그 형식은 DH{…} 입니다.
문제 폴더 압축을 풀고 vsc로 연 후 vsc의 검색 기능(Ctrl + Shift + F)를 사용하면 금방 플래그를 찾을 수 있다.
File Download 취약점이 존재하는 웹 서비스입니다.
flag.py를 다운로드 받으면 플래그를 획득할 수 있습니다.
접속 정보를 통해 사이트를 들어가면 간단한 메모를 쓸 수 있는 페이지가 있다. 시험 삼아 메모를 써보니 메모의 경로가 ~/read?name=awd 이런식으로 나타났다. 문제에서 flag.py를 다운받는다면 플래그를 얻을 수 있다 했으니 혹시 name에 flag.py를 넣으면 파일 내용이 나타나지 않을까 싶어 입력해봤지만 바로 나오진 않았다. 서버 코드를 보니
try:
with open(f'{UPLOAD_DIR}/{filename}', 'rb') as f:
data = f.read()
except (IsADirectoryError, FileNotFoundError):
error = True
이런 내용의 코드가 있었고 UPLOAD_DIR은 'uploads' 였다. 이 코드를 보고 내가 적은 메모는 uploads 파일 안에 들어가니 그 위에 무언가 더 있지 않을까 생각했고 name에 ../flag.py를 입력하니 플래그를 얻을 수 있었다.
suninatas.com의 문제입니다.
<%
str = Request("str")
If not str = "" Then
result = Replace(str,"a","aad")
result = Replace(result,"i","in")
result1 = Mid(result,2,2)
result2 = Mid(result,4,6)
result = result1 & result2
Response.write result
If result = "admin" Then
pw = "????????"
End if
End if
%>
Replace 함수는 문자열을 바꾸는 것이고 Mid 함수는 첫번째 수에서 두번째 수만큼 문자을 가져오는 것이다.
admin이라는 문자열을 만들어야 하므로 Replace와 Mid를 고려해 적절한 문자열을 입력해야한다.
admin을 만들기 위해선 a를 입력해 aad를 만들고 mi를 입력해 min을 만든다. 그러면 Mid 함수에서 ad와 min을 가져오므로 admin이 완성된다.
콘솔을 열어보니 힌트에 id와 pw가 같다고 한다. 하지만 javascript 소스를 보니 id와 pw가 같은데 join 버튼을 누르면 submit이 되지 않는다. 간단하게 콘솔에서 직접 javascript를 작성해
form 태그를 submit 시켰다.
3번 문제는 Write articles in Notice Board! 이라는 문구말곤 아무것도 보이지 않는다. 그래서 문구 그대로 notice 페이지에서 글을 작성했더니 authKey를 얻을 수 있었다.
notice 페이지에서 글을 쓰는 방법은 url에서 notice 뒤에 /write를 붙이면 된다.
point를 50까지 올리면 되는 문제다. 버튼을 누르면 포인트를 올릴 수 있지만 25까지가 최대다. point를 25까지 올리고 버튼을 눌러보면 I like the SuNiNaTaS browser! 라는 alert 창이 뜨는데 이 말은 User-Agent를 조작해 브라우저를 SuNiNaTaS로 바꾸란 소리다. Burp Suite를 이용하면 쉽게 풀 수 있다.
소스를 보면 힌트에 12342046413275659가 있고 javascript 코드에 밑의 코드가 있다.
eval(function(p,a,c,k,e,r){e=function(c){return
c.toString(a)};if(!''.replace(/^/,String)){while(c-
-)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function()
{return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new
RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('g l=m
o(\'0\',\'1\',\'2\',\'3\',\'4\',\'5\',\'6\',\'7\',\'8\',\'9\',\'a\',\'b
\',\'c\',\'d\',\'e\',\'f\');p q(n){g h=\'\';g j=r;s(g i=t;i>0;){i-=4;g
k=(n>>i)&u;v(!j||k!=0){j=w;h+=l[k]}}x(h==\'\'?
\'0\':h)}',34,34,'||||||||||||||||var|result||start|digit|digitArray|ne
w||Array|function|PASS|true|for|32|0xf|if|false|return'.split('|'),0,
{}))
이 javascript 코드는 현재 패킹된 상태이므로 언패킹을 해줘야한다.
이 사이트에서 언패킹을 하면 다음과 같은 코드가 나온다.
var digitArray=new
Array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');
function PASS(n)
{
var result='';
var start=true;
for(var i=32;
i>0;
)
{
i-=4;
var digit=(n>>i)&0xf;
if(!start||digit!=0)
{
start=false;
result+=digitArray[digit]
}
}
return(result==''?'0':result)
}
PASS 라는 함수에 힌트에서 얻은 숫자를 넣으면 키값을 얻을 수 있다.
5개의 글이 있는데 README 글에 들어가면 input과 sql 쿼리가 있다. 간단한 sqli인 1 or 1 = 1를 사용해봤는데 No hacking 이라는 alert창이 떳다. 그래서 = 과 비슷한 역할을 하는 like 구문을 사용해보니 축하한다는 alert창과 함께 진짜 README 페이지로 이동했다. 키를 찾으라길래 콘솔을 열어 소스를 보니

KEY_HINT 옆에 Rome's First Emperor를 발견했다. 구글에 검색해보니 Caesar Augustus라는 사람의 정보가 나왔고 이름을 auth 키 값에 넣으니 문제가 풀렸다.