<목차>
1. 실습 목표
2. 구성 환경
3. 실습 과정
4. 결과 분석
1. 실습 목표
SQL injection을 통해 무단으로 계정에 로그인하는 공격을 시도하고 이를 방지하기 위해 어떤 조치를 수행해야 하는지를 실습한다.
2. 구성 환경
IP | MAC | 역할 | |
Database_web_server | 192.168.112.154 | 00:0c:29:1d:21:65 | Database클라이언트 및 Web서버 |
Database_server | 192.168.113.155 | 00:0c:29:d5:f7:18 | Database서버 |
Attacker | 192.168.111.26 | 00:0c:29:1c:c7:bc | 공격자 |
3. 실습 과정
[root@ap ~]# cat /app/apache/htdocs/conn.php
<?
$server="oracle";
$user_name = "php";
$password = "php";
$conn=oci_connect($user_name,$password,$server);
?>
접속할 Database Client의 서버 정보 및 접속 계정을 입력한다.
4. 결과 분석
위와 유사하게 계정과 무관하게 비밀번호만을 이용해 로그인이 수행되게 하는 것도 가능하다.
# vi view.php
...
else {
$sql="select id, pw from id where id = '$id' and pw = DBMS_CRYPTO.Hash(to_clob(to_char('$pw')),2)";
// echo("sql = $sql<br>");
$result=oci_parse($conn,$sql);
$re=oci_execute($result);
$row_num=oci_fetch_all($result,$row);
...
SQL injection공격이 가능한 코드를 보게 되면 id와 pw를 바로 sql문장에서 실행하기 때문에 id에 입력하는 텍스트로 SQL문장의 기능을 변조하는 것이다.
# vi view.php
...
else {
$sql="select id, pw from id where id = :v_id and pw = DBMS_CRYPTO.Hash(to_clob(to_char(:v_pw)),2)";
// echo("sql = $sql<br>");
$result=oci_parse($conn,$sql);
oci_bind_by_name($result, ":v_id", $id);
oci_bind_by_name($result, ":v_pw", $pw);
$re=oci_execute($result);
$row_num=oci_fetch_all($result,$row);
...
SQL injection공격을 방지하기 위해 bind 변수를 사용하여 입력하는 텍스트가 SQL문장에서 즉시 실행되는 것이 아닌 DB안에서 정보를 확인하고 가져오는 것으로 변경한다.
'교육 > Security' 카테고리의 다른 글
Day 76 (Firewall) (0) | 2020.03.16 |
---|---|
Day 74 (Web mitm) (0) | 2020.03.12 |
Day 74 (TCP Hijacking) (2) | 2020.03.12 |
Day 73 (DDoS) (0) | 2020.03.11 |
Day 73 (DoS Attack) (0) | 2020.03.11 |