늘모자란, 개발

늘모자란, 개발


What kind of this Database?

you have to find correlation between user name and database.


들어가보면 휑한 화면이 있다. 소스를 보면

<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
<script text="javascript">
function fschk(f){
 if(f.user_id.value=="admin"){
  alert("dont access with 'admin'");
  return false;
 }
}
</script>
<style>
    body {width:100%; height:100%; padding:0; margin:0;}
</style>
</head>
<body>

<div style='width:400px; margin:50 auto; text-align:center;'>
 <h2>BLUEMEMO SYSTEM <sub>0.53 beta</sub></h2>
 <form method="post" action="memo.php" onsubmit="return fschk(this);">
 USER <input type='text' maxlength=16 size=16 name='user_id' /> <input type='submit' value='LOGIN' />
 </form>
</div>

</body>


이렇게 되어 있는데 admin + ' ' 이나 ' ' + admin 으로 들어가면 알아서 trim되기때문에 admin으로 들어갈 수 있다.
수많은 사람들의 흔적을 볼 수 있는데 이걸로 뭘 할 수 있을지 생각해야겠다.
이 문제가 웃긴게 다른 사람들이 한 수많은 삽질을 볼 수 있다는것이다 ㅋㅋ 생각이 다들 비슷비슷한듯하다...


아이디 시도로 요렇게 해봤다.

0x61646d696e
CHAR(97,100,109,105,110) //칸을 늘려야 했음

근데 애초에 뭐 다 처리를 해놨는지 안된다.

그래서 이제 기본적으로 가보기로 했다.
' " < / 를 넣어보기로 한것이다

"엔 반응이 없는데 ' 랑 / 때는 반응이 있었다.
Fatal error: Uncaught exception 'Exception' with message 'Unable to open database: unable to open database file' in /home/www/db_is_really_good/sqlite3.php:7 Stack trace: #0 /home/www/db_is_really_good/sqlite3.php(7): SQLite3->open('./db/wkrm_/.db') #1 /home/www/db_is_really_good/memo.php(14): MyDB->__construct('./db/wkrm_/.db') #2 {main} thrown in /home/www/db_is_really_good/sqlite3.php on line 7


sqlite3.php 를 열려는 와중에 에러가 난다고 하는데
./db/wkrm_/.db 를 찾을 수 없다고 하는것 같다. 확실하게 하기 위해서 슬래쉬 뒤에 a를 붙여서 /a로 시도 해보았다.

Fatal error: Uncaught exception 'Exception' with message 'Unable to open database: unable to open database file' in /home/www/db_is_really_good/sqlite3.php:7 Stack trace: #0 /home/www/db_is_really_good/sqlite3.php(7): SQLite3->open('./db/wkrm_/a.db') #1 /home/www/db_is_really_good/memo.php(14): MyDB->__construct('./db/wkrm_/a.db') #2 {main} thrown in /home/www/db_is_really_good/sqlite3.php on line 7


그러니까 즉 참조하는 주소는 ./db/wkrm_().db 라고 볼 수 있다. admin이 블럭되고 있는 아이디니까 여기에 admin을 넣어서 접근해본다.
php 주소가 하나 적혀있고 해당 주소에서 나오는 key를 입력하여 해결!
2016/06/07 21:14 2016/06/07 21:14
This is another programming language.

Can you read this source code?


문제에 들어가서 파일을 하나 다운받아보면 탭과 스페이스만으로 이루어진 진짜 별 또라이같은 파일을 다운로드할 수 있게 되어 있다.
뭔가 규칙은 있겠지만 그냥 병신같다는 말밖에 안나온다. 문제가 왜 WTF인지 알겠다.
hex로 읽어도, base64 encode해봐도 space, tab, lf밖에 안나온다.

혹시나해서 위 세개로 검색하니 ㅋㅋ brainfuck 마냥 저걸로만 이루어진 언어가 있단다. 진짜 지랄났다고밖에 말을 할수가 없다...
이곳에서 whitespace compiler(-_-)를 지원한다. 복사해서 돌려보면 답이 나온다.

세상에 병신같은건 oak 나 brainfuck 같은류만 있는줄 알았더니 정말 신세계가 따로 없다. 허참ㅋㅋㅋ

2016/06/07 20:50 2016/06/07 20:50
I have accounts. but, it's blocked.

can you login bypass filtering?


인젝션 느낌이 솔솔 난다.
소스를 보라고 권하기 때문에 소스를 보자면

 <?php

if (isset($_GET['view-source'])) {
    show_source(__FILE__);
    exit();
}

/*
create table user(
 idx int auto_increment primary key,
 id char(32),
 ps char(32)
);
*/

 if(isset($_POST['id']) && isset($_POST['ps'])){
  include("../lib.php"); # include for auth_code function.

  mysql_connect("localhost","login_filtering","login_filtering_pz");
  mysql_select_db ("login_filtering");
  mysql_query("set names utf8");

  $key = auth_code("login filtering");

  $id = mysql_real_escape_string(trim($_POST['id']));
  $ps = mysql_real_escape_string(trim($_POST['ps']));

  $row=mysql_fetch_array(mysql_query("select * from user where id='$id' and ps=md5('$ps')"));

  if(isset($row['id'])){
   if($id=='guest' || $id=='blueh4g'){
    echo "your account is blocked";
   }else{
    echo "login ok"."<br />";
    echo "Password : ".$key;
   }
  }else{
   echo "wrong..";
  }
 }
?>
<!DOCTYPE html>
<style>
 * {margin:0; padding:0;}
 body {background-color:#ddd;}
 #mdiv {width:200px; text-align:center; margin:50px auto;}
 input[type=text],input[type=[password] {width:100px;}
 td {text-align:center;}
</style>
<body>
<form method="post" action="./">
<div id="mdiv">
<table>
<tr><td>ID</td><td><input type="text" name="id" /></td></tr>
<tr><td>PW</td><td><input type="password" name="ps" /></td></tr>
<tr><td colspan="2"><input type="submit" value="login" /></td></tr>
</table>
 <div><a href='?view-source'>get source</a></div>
</form>
</div>
</body>
<!--

you have blocked accounts.

guest / guest
blueh4g / blueh4g1234ps

-->



blueh4g라는 아이디로 로그인을 해야되는데 로그인이 안되는 그런 느낌적인 느낌이다.
실제로 시도해봐도 블럭된다고 뜬다. 이제 우린 어떻게 해야할것인가? 특문같은것은 mysql_real_escape_string 덕에 시도할맛이 안나고..
그런데 마지막 주석이 의미심장하다.

가만보니 비교문도 === 가 아니라 == 이다. 이는 대소문자를 가리지 않는다는건데.
혹시나 하는마음에 Guest / guest를 시도하니 패스...

=== 를 써서 비교하는게 맞을 것 같다. 아니면 이상한 아이디랑 비밀번호 쓰지 말든지..
2016/06/07 20:35 2016/06/07 20:35
click the button!

i can't catch it!


느낌이 뭐가 졸라 날아다니고 그걸 클릭해야되는... 느낌이다.


날아다니진 않고 그냥 마우스 절대값에서 X,Y를 추가해 따라다닌다. 일반적으론 클릭할 수 없다.
오른쪽 마우스 클릭을 막아놨지만 메뉴에서 소스보기를 해서 소스를 확인하도록 하자.

<title>Just click it!</title> <style> body {color:#fff; background-color:#000;}; </style> <script src="./p8.js"></script>
<body>&nbsp;</body>
<script>eval(unescape_blue14("%72%7d%71%85%7b%73%7c%84%34%87%82%77%84%73%2c%85%7c%73%83%71%6d%80%73%6b%70%7a%85%73%37%3a%2c%26%29%3a%3a%29%3d%38%29%3d%3d%29%40%3c%29%38%3a%29%3d%3d%29%3d%38%29%3a%3b%29%38%3c%29%3d%39%29%40%39%29%3d%37%29%38%3c%29%38%3a%29%40%39%29%40%3a%29%40%41%29%3d%6d%29%3d%39%29%3a%3b%29%38%3c%29%40%36%29%3d%72%29%40%39%29%3d%3d%29%40%3a%29%3d%3d%29%3d%72%29%3d%71%29%3a%38%29%3c%72%29%3d%36%29%40%39%29%3d%72%29%3d%6d%29%40%3b%29%40%3a%29%3d%39%29%3a%39%29%38%3c%29%3a%3c%29%3a%3a%29%3d%3d%29%3d%71%29%40%36%29%40%3b%29%40%3a%29%38%3a%29%40%3a%29%40%41%29%40%36%29%3d%39%29%3a%3b%29%38%3c%29%3d%36%29%40%3b%29%40%3a%29%40%3a%29%3d%72%29%3d%71%29%38%3c%29%38%3a%29%3d%72%29%3d%71%29%3d%3a%29%3d%72%29%3d%37%29%40%3b%29%40%39%29%3a%3b%29%38%3c%29%3d%71%29%3d%72%29%3d%41%29%40%36%29%38%71%29%38%72%29%3a%39%29%38%3c%29%38%3a%29%3d%72%29%3d%71%29%3d%37%29%3d%6d%29%3d%3d%29%3d%37%29%3d%41%29%3a%3b%29%38%3c%29%40%3d%29%3d%3d%29%3d%71%29%3d%38%29%3d%72%29%40%3d%29%39%3a%29%3d%6d%29%3d%72%29%3d%37%29%3c%72%29%40%3a%29%3d%3d%29%3d%72%29%3d%71%29%3a%3b%29%38%70%29%3a%3d%29%3d%41%29%3d%39%29%40%41%29%3a%3b%29%39%40%29%3D%37%29%39%4B%29%39%4C%29%38%70%29%3a%39%29%38%3c%29%38%3a%29%40%3c%29%3c%72%29%3d%6d%29%40%3b%29%3d%39%29%3a%3b%29%38%3c%29%3d%37%29%3d%6d%29%3d%3d%29%3d%37%29%3d%41%29%38%3a%29%3d%70%29%3d%39%29%38%3b%29%38%3c%29%3a%3c%29%3a%3a%29%39%3b%29%3d%38%29%3d%3d%29%40%3c%29%3a%3c%29%3a%3a%29%3d%3d%29%3d%71%29%40%36%29%40%3b%29%40%3a%29%38%3a%29%40%3a%29%40%41%29%40%36%29%3d%39%29%3a%3b%29%38%3c%29%40%3a%29%3d%39%29%40%40%29%40%3a%29%38%3c%29%38%3a%29%40%38%29%3d%39%29%3c%72%29%3d%38%29%3d%72%29%3d%71%29%3d%6d%29%40%41%29%38%3a%29%40%39%29%40%3a%29%40%41%29%3d%6d%29%3d%39%29%3a%3b%29%38%3c%29%40%3d%29%3d%3d%29%3d%38%29%40%3a%29%3d%3c%29%3a%38%29%39%41%29%39%70%29%39%3c%29%3a%39%29%38%3c%29%38%3a%29%3d%3d%29%3d%38%29%3a%3b%29%38%3c%29%3d%3c%29%3d%3d%29%3d%71%29%40%3a%29%38%3c%29%38%3a%29%40%3c%29%3c%72%29%3d%6d%29%40%3b%29%3d%39%29%3a%3b%29%38%3c%29%3d%38%29%3d%72%29%38%3a%29%40%41%29%3d%72%29%40%3b%29%38%3a%29%40%3d%29%3c%72%29%3d%71%29%40%3a%29%38%3a%29%40%3a%29%3d%72%29%38%3a%29%3d%40%29%3d%72%29%3d%3d%29%3d%71%29%3a%3d%29%38%3a%29%3d%37%29%3c%72%29%40%3a%29%3d%37%29%3d%3c%29%38%3a%29%3d%36%29%40%3b%29%40%3a%29%40%3a%29%3d%72%29%3d%71%29%39%38%29%38%3a%29%3d%3d%29%3d%3a%29%38%3a%29%40%41%29%3d%72%29%40%3b%29%38%3a%29%3d%37%29%3c%72%29%3d%71%29%38%3b%29%38%3c%29%3a%3c%26%2d%2d%43%7d%70%78%45%72%7d%71%85%7b%73%7c%84%34%75%73%84%4d%7a%73%7b%73%7c%84%4a%89%53%72%2c%26%73%83%71%26%2d%43%72%7d%71%85%7b%73%7c%84%34%7d%7c%7b%7d%85%83%73%7b%7d%86%73%45%73%83%71%72%77%86%43%72%7d%71%85%7b%73%7c%84%34%7d%7c%79%73%89%80%82%73%83%83%45%7c%7d%79%80%43%7d%70%78%34%83%84%89%7a%73%34%7a%73%74%84%45%33%38%36%36%43%7d%70%78%34%83%84%89%7a%73%34%84%7d%80%45%33%38%36%36%43%86%6d%82%24%77%45%36%32%6d%88%45%36%32%6d%89%45%38%36%36%32%83%87%45%37%32%82%45%38%36%36%43%72%7d%71%85%7b%73%7c%84%34%75%73%84%4d%7a%73%7b%73%7c%84%4a%89%53%72%2c%2b%73%83%71%2b%2d%34%83%84%89%7a%73%34%84%7d%80%45%33%3b%36%36%43%72%7d%71%85%7b%73%7c%84%34%7d%7c%71%7d%7c%84%73%88%84%7b%73%7c%85%45%7c%7d%79%80%43%72%7d%71%85%7b%73%7c%84%34%7d%7c%83%73%7a%73%71%84%83%84%6d%82%84%45%7c%7d%79%80%43%72%7d%71%85%7b%73%7c%84%34%7d%7c%72%82%6d%75%83%84%6d%82%84%45%7c%7d%79%80%43"));</script>
<script>document.getElementById('hint').value="click button, if you want to get the authentication key";</script>



오우야.. 개빡세게 난독화되어있다.
unescape_blue14라는건 본적이 없기 때문에 사용자 함수라고 생각한다.
하지만 소스상에서는 확인할 수 없었기 때문에 뭔가 단서가 없을까 하다가 로드하는 스크립을 보니 p8.js 라는걸 로드하고 있다.

p8.js 의 소스는 다음과 같다.

function get_br_blue(){
 var br="def";
 if(navigator.appName.indexOf("Netscape")>-1){
  if(navigator.appVersion.indexOf("Macintosh")>-1) br="FFM";
  if(navigator.appVersion.indexOf("Windows")>-1) br="FFW";
 }else if(navigator.appName.indexOf("Microsoft")>-1){
  if(navigator.appVersion.indexOf("MEIE 6.0")>-1) {
   br="ie6";
  }else{
    br="ie";
  }
 }
 return br;
}

function unescape_blue14(str){
 var result="";
 for(i=1;i<str.length;i+=3){
  result+=""+String.fromCharCode(parseInt((str.substr(i,2)).toString(2),14));
 }
 return result;
}

function nokp(){
 document.getElementById("hint").focus();
 return false;
}

function escdiv(e){
 if(get_br_blue()=="FFM" || get_br_blue()=="FFW"){mx=e.clientX;my=e.clientY;}else{mx=event.x;my=event.y;}
 obj.style.left=mx+ax;
 obj.style.top=my+ay;
 if(sw==1){ax--;ay--;if(i==r){sw=2;i=0;}}
 if(sw==2){ax++;ay--;if(i==r){sw=3;i=0;}}
 if(sw==3){ax++;ay++;if(i==r){sw=4;i=0;}}
 if(sw==4){ax--;ay++;if(i==r){sw=1;i=0;}}
 i++;
}



여기까지 하고 이걸 어떻게 풀까 고민하는데.. html 이 보였다.

<div style="position: absolute; left: 186px; top: 692px;" id="esc"><input type="button" value="click me!" onclick="window.location='?key=2c67';" onfocus="nokp();"></div>


아니.. 클릭하면 ?key=2c67로 간다잖아?
URL을 입력하니 단번에 패스... 뭐여 이거 ..........
2016/06/07 20:23 2016/06/07 20:23
javascript puzzle challenge

just enjoy!

webhacking.kr에 비해서 문제가 신선하다는 느낌을 받기엔 좀 이른감이 있지만, QR code 퍼즐이라고 한다.

내가 생각하기로 QR코드 생긴건 정말 멋대로 생겼을거기땜에 결국 QR code가 valid한지 체크하는 검사도 수반되어야할 것 같은 생각이 들었다.

<center>
<script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js'></script>
<script type="text/javascript" src="jquery.jqpuzzle.js"></script>
<script type='text/javascript' src='jquery.color-RGBa-patch.js'></script>
<script type='text/javascript' src='jquery.blockUI.js'></script>
<script type="text/javascript">
/*<![CDATA[*/
 $(function(){ $('#join_img').attr('src',unescape('.%2f%69%6d%67%2f%71%72%2e%70%6e%67'));
  $('#join_img').jqPuzzle({rows:6,cols:6,shuffle:true,numbers:false,control:false,style:{overlap:false}});
  hide_pz();});
 function hide_pz(){
  var pz=$('#join_img div'); if(pz[pz.length-2]){$(pz[1]).remove();$(pz[pz.length-2]).remove();}else{setTimeout("hide_pz()",5);}
 }
/*]]>*/
</script>
<style>
#join_img {padding:15px 15px 0 15px; border:2px solid #999; background-color:#444;}
</style>
<br />
<h1>QR Code Puzzle</h1>
<br />
<img id="join_img" /><br />


소스를 읽어보니 jqPuzzle이라는 라이브러리를 이용해 %2f%69%6d%67%2f%71%72%2e%70%6e%67 , 즉 /img/qr.png를 퍼즐로 만든다.
이렇게까지 말했는데 바보가 아닌이상에야 퍼즐을 다 풀진않겠지?

어쨌든 QR 코드를 찍으면 키가 나온다. 세션에 따라 키가 바뀌는듯하니 그냥 주소를 따서 보면되겠다.
2016/06/07 18:07 2016/06/07 18:07
연구실 선배가 심심해서 하고 있다길래 나도 심심한차에 시작해보기로 했다.

원래 CTF나 워게임같은경우는 암묵적인 룰(??) 이 있는건지 시커먼 배경인데 여긴 되게 깔끔하고 흰색톤이었다. 최근에 만들어진듯...
문제마다 포인트가 있긴한데 문제가 많진않았다. 그게 첫인상... 어쨌든 시작하기로 했으니 잘 해보자 생각한다.

문제마다 힌트가 주어지는 구조인것 같은데 첫 문제는 이런 힌트가 있고,



can you see HTTP Response header?


문제에 들어가니 그냥 you've already got key! :p 만 있다.
시키는데로 순순히 헤더를 까보기로 한다.

GET http://wargame.kr:8080/already_got/ HTTP/1.1
Host: wargame.kr:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ko,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://wargame.kr/challenge
Cookie: ...
Connection: keep-alive


아주 장황한 쿠키가 있는데 아마 쿠키 사이에 flag란게 숨어 있을 느낌이다.
fiddler로 쿠키를 urldecode해봤는데 세션 데이터가 나왔다. 해쉬가 두어개 있길래 입력해봤는데 아니라고 한다.
그래서 이상하다 싶어서 크롬을 열어서 Network 탭에서 보니까 오마이갓.. 정식 헤더가 아니라 그런지 안나온느낌이다.
헤더에 플래그가 있으니 당황하지 말고 입력해주자.
2016/06/07 17:56 2016/06/07 17:56