9. SQL Injection 정리.

(본 문서의 내용의 부족한 부분은 댓글로 지적해주시길 바랍니다.)


SQL Injection 이란 sql 쿼리를 조작하여 원하는 정보를 출력하게 할 수 있는 기법입니다.


<html>

<head>

<title>index</title>

</head>

<body>

<form action="./index.php" method="get">

<input name="pw" type="text" />

<input type="submit" />

</form>

</body>

</html>

<?php

include("./db_connect.php");

if(empty($_GET['pw'])) {

exit();

}

else {

$pw = $_GET['pw'];

}

$strQuery = "select id from user where id='admin' and pw='".$pw."'";

$result = @mysql_fetch_array(mysql_query($strQuery)) or die("query error");

echo($strQuery."<br />");

echo($result['id']);

?>


이러한 코드의 로그인이 있다고 가정하겠습니다.


$strQuery = "select id from user where id='admin' and pw='".$pw."'";


이 부분에서 저희가 패스워드를 입력하면 입력한 쿼리를 데이터베이스에 질의하여 결과를 가져오는 방식입니다.


(magic_quote = Off 입니다.)




그러면 이제 pw clause에 장난을 칠 수 있습니다.



#, -- x 은 sql에서의 주석 (comment) 입니다.


# 은 바로 뒤 전체를 주석화시키고, -- 은 공백과 어떠한 한 글자가 있으면 주석화시킵니다.


1 and 0 or 1 - > 0 or 1 -> 1


최종적으로 true가 되어 admin 아이디가 출력되었습니다.


이렇게 쿼리에 논리 오류를 넣어 원하는 값을 도출할 수 있는 기법이 SQL Injection 입니다.

'HackCat' 카테고리의 다른 글

9. SQL Injection 정리.  (0) 2015.11.10
8. 64-bit Return To Libc.  (0) 2015.06.20
7. 64-bit Buffer OverFlow 정리.  (0) 2015.06.10
6. Chaining RTL Calls 정리.  (2) 2015.05.30
5. Ret sleding 정리.  (0) 2015.05.20
4. FPO (Frame Pointer Overwrite) 정리.  (0) 2015.05.10

8. 64-bit Return To Libc.

이번 문서는 이전 문서와 같은 환경이지만, NX 옵션이 부가되어 이전과 같은 방법으로는 쉘을 실행할 수 없게 되었다.


그러므로 libc 영역으로 리턴 주소를 조작하여 /bin/sh 문자열 주소를 넣어줘야 한다.


하지만 이전에도 언급했듯이 조작할 수 있는 주소는 0x00007fffffff까지다. 그렇기에 시스템 주소 + dummy + /bin/sh 를 다 넣으려면 당연히 제한 주소를 뛰어넘는다.


지인에게 물어보니 rdi 값을 조작하여야 하고 64비트 함수 호출 규약 (rdi, rsi, ~) 에 따라 argc가 rdi에 들어가는 것까지 알아내었다.


이 이후는 필자가 공격에 성공하지 못하여 적지 못함.


빠른 시일 내로 업데이트할 것을 약속하겠다.

'HackCat' 카테고리의 다른 글

9. SQL Injection 정리.  (0) 2015.11.10
8. 64-bit Return To Libc.  (0) 2015.06.20
7. 64-bit Buffer OverFlow 정리.  (0) 2015.06.10
6. Chaining RTL Calls 정리.  (2) 2015.05.30
5. Ret sleding 정리.  (0) 2015.05.20
4. FPO (Frame Pointer Overwrite) 정리.  (0) 2015.05.10

7. 64-bit Buffer OverFlow 정리.

필자는 최근에서야 64bit 리눅스 서버를 접해보았고 그에 따라 가장 기초적인 bof 공격을 해보며 여러가지를 검색해보며 많은 지식을 습득하게 되었다.


팀원의 서버를 빌려 테스트한 것으로 팀원에게 감사를 드리고, 커널 환경은 3.13.0-32-generic이다. 그리고, SSP, NX, ASCII-Armor, ASLR이 걸리지 않은 상태로 테스트했다.


64bit의 시스템에서는 64bit의 메모리 주소가 사용가능하다. 하지만 이 중 유저가 사용할 수 있는 공간은 47bit로 0x00007fffffffffff 까지만 사용가능하고 이 이상을 넘어가게 되면 에러가 발생하며 바로 retq 명령어 주소로 넘어가는 것을 확인할 수 있다.



본 소스는 간단한 bof 소스로 strcpy ()의 취약점을 이용하여 root의 setuid가 걸려있는 프로그램을 공격할 것이다.



0xe0의 공간을 생성하고, strcpy 쪽에서 0x8 정도를 추가한다. 즉, 그러면 우리는 총 216 byte의 공간을 덮어씌우면 된다.


gdb에서 더미 데이터를 넣어보면



일정 값 (0x7ffffffff) 을 넘으면 0x4005da retq 주소로 돌아가는 것을 볼 수 있다.


하지만 어차피 우리가 조작할 ret은 일정 값보다 작으니 조작이 가능하며 NX 기법이 걸려있지 않아 고전적인 방법을 사용할 것이다.


Payload = "\x90" * 100 + "shellcode 27 byte" + "\x90" * 89 + "ret"

shellcode는 27 byte의 코드를 쓸 것이다.

\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05



ret을 조작해줄 buffer 주소로서 0x7fffffffe818의 주소를 사용할 것이다.



root의 권한을 가진 것을 볼 수 있다.


'HackCat' 카테고리의 다른 글

9. SQL Injection 정리.  (0) 2015.11.10
8. 64-bit Return To Libc.  (0) 2015.06.20
7. 64-bit Buffer OverFlow 정리.  (0) 2015.06.10
6. Chaining RTL Calls 정리.  (2) 2015.05.30
5. Ret sleding 정리.  (0) 2015.05.20
4. FPO (Frame Pointer Overwrite) 정리.  (0) 2015.05.10
◀ PREV 123 NEXT ▶