Hacking/WebGoat

WebGoat ) SQL Injection

proggg 2020. 5. 18. 19:38

 

 

 

1. SQL Injection with WebGoat (100 pts)

- Run WebGoat developer version.
A) Solve the problem ([Injection Flaws] - [LAB: SQL Injection] - [Stage 1: String SQL Injection]). (20 pts)

Stage 1. 의 string SQL injection λ¬Έμ œμ΄λ‹€. μž…λ ₯ν•  수 μžˆλŠ” 곡간을 보면 Password λž€μ— user 의 input 이 λ“€μ–΄κ°ˆ 수 μžˆλŠ”κ±Έ μ•Œ 수 μžˆλ‹€.

문제의 λͺ…μ‹œ 사항은 SQL injection 을 μ΄μš©ν•΄ κΆŒν•œμ„ bypass ν•˜μ—¬, Neville 의 계정에 μ˜¬λ°”λ₯Έ password 없이 둜그인 ν•˜λŠ” 것이닀. λ˜ν•œ κ΄€λ¦¬μžλ‘œμ„œμ˜ κΈ°λŠ₯을 ν™•μΈν•˜λŠ” 것이닀.

일반 μ‚¬μš©μžμ—μ„œ μ•„λ¬΄λŸ° password λ₯Ό μž…λ ₯ν•˜μ—¬ login λ²„νŠΌμ„ λˆ„λ₯΄λ©΄ Login Error κ°€ λ°œμƒν•œλ‹€. λ‹Ήμ—°ν•˜λ‹€ password λ₯Ό λͺ¨λ₯΄κ³ , μ•„λ¬΄κ±°λ‚˜ μž…λ ₯ν–ˆμœΌλ‹ˆκΉŒ.

 

κ·Έλ ‡λ‹€λ©΄ 이 password λž€μ— ‘==’’or’ λ₯Ό 집어넣고 Login 을 ν•œλ‹€.

κ·Έλ ‡λ‹€λ©΄ λ‘œκ·ΈμΈμ— μ„±κ³΅ν•œ 것을 λ³Ό 수 μžˆλ‹€.

--문제λ₯Ό 이미 ν‘Ό λ’€μ—¬μ„œ 이 μ΄λ―Έμ§€λŠ” κ°•μ˜ μ˜μƒμ„ 캑쳐 ν–ˆμŠ΅λ‹ˆλ‹€.---

이 처럼 κ΄€λ¦¬μž 계정에 μ ‘κ·Ό ν•˜μ—¬ κ΄€λ¦¬μžμ˜ κΈ°λŠ₯듀을 λͺ¨λ‘ μ‚¬μš©ν•  수 μžˆλŠ” κ²ƒμœΌλ‘œ 보여진닀.

 

문제 ν‘ΈλŠ”λ° μ„±κ³΅ν–ˆλ‹€.  κ·Έλ ‡λ‹€λ©΄ μ΄λŸ¬ν•œ string injection 이 μ–΄λ–»κ²Œ ν†΅ν•˜κ²Œ 된 건지. μ–΄λ–€ 뢀뢄이 μ·¨μ•½ν–ˆλ˜ 건지 μ•Œμ•„λ³΄μž.

μš°μ„  ‘=’’or’ 이 λ¬΄μ—‡μΌκΉŒ ?

WebGoat 의 js νŒŒμΌμ„ 확인해볼 ν•„μš”κ°€ μžˆλ‹€. Java source 의 Login.jsp 의 μ†ŒμŠ€λ₯Ό 확인해보면 login 을 ν• λ•Œ sql query λ₯Ό λ§Œλ“œλŠ” λ¬Έμž₯이 μžˆλ‹€.

WebGoat Developer Version 의 Java μ½”λ“œμ΄λ‹€.

λ‹€μŒκ³Ό 같은 λ¬Έμž₯이닀. Userid λŠ” μŠ€ν¬λ‘€μ„ 톡해 정해지고 password λŠ” μ‚¬μš©μžκ°€ μž…λ ₯ν•˜λŠ” password κ°€ κ·ΈλŒ€λ‘œ λ“€μ–΄κ°€κ²Œ λœλ‹€. λ”°λΌμ„œ μš°λ¦¬κ°€ μž…λ ₯ν•œ ‘=’’or’ λŠ” λ‹€μŒμ˜ SQL ꡬ문 처럼 NULL or NULL=NULL 이 λœλ‹€. λ”°λΌμ„œ 항상 TRUE 값을 κ°€μ§€κ²Œ λ˜λŠ” 것이닀.

 

 

 

SQL QUERY


μœ„μ˜ query λ₯Ό 짚고 λ„˜μ–΄κ°„λ‹€. Sql λ¬Έμž₯μ—λŠ” DDL(Data Definition Language), DML(Data Manipulation Language), DCL(Data Control Language) κ°€ μžˆλ‹€. κ·Έ μ€‘μ—μ„œ js μ•ˆμ— 포함 λ˜μ–΄ user μ—κ²Œ μ§μ ‘μ μœΌλ‘œ μ‚¬μš©λ˜λŠ” λ¬Έμž₯은 λŒ€λΆ€λΆ„ DML 이닀. DML 은 λ°μ΄ν„°μ˜ μ‚½μž…, μˆ˜μ •, μ‚­μ œ 의 κΈ°λŠ₯듀을 λ‹΄λ‹Ήν•œλ‹€.

μœ„μ˜ sql query λŠ” SELECT * FROM employee where userid = ‘’ and password ‘’ 이닀.

Select λŠ” 데이터λ₯Ό λ°μ΄ν„°λ² μ΄μŠ€λ‘œλΆ€ν„° κ°€μ Έμ™€μ„œ μ‚¬μš©μžμ—κ²Œ λ³΄μ—¬μ£ΌλŠ” 역할을 ν•œλ‹€.

‘ * ’ λŠ” λͺ¨λ“  μ†μ„±μ˜ 데이터λ₯Ό κ°€μ Έμ˜¨λ‹€λŠ” 것을 μ˜λ―Έν•˜κ³  From 은 데이터λ₯Ό κ°€μ Έμ˜¬ μŠ€ν‚€λ§ˆλ₯Ό μ§€μ •ν•œλ‹€.

Where 은 μ†μ„±μ˜ νŠΉμ • 값을 가져와 μ‚¬μš©μžμ—κ²Œ 보여쀄 지 κ²°μ •ν•˜λŠ”λ°,λ°μ΄ν„°λ² μ΄μŠ€μ— μ‘΄μž¬ν•˜λŠ” id 와 password κ°€ κ·Έ λŒ€ν‘œμ μΈ 예 이닀.


 

이와 같은 ν˜•νƒœλ‘œ sql query 에 완성이 λ˜λŠ”λ° -‘’or’’=’’ – 기쑴의 sql λ¬Έμž₯에 있던 μž‘μ€ λ”°μ˜΄ν‘œμ™€ ν•¨κ»˜ 완성이 λ˜μ–΄ Null or Null=Null  이 λ˜λŠ” 것이닀. Null 은 false 인데 , null=null 은 항상 True κ°€ λœλ‹€. λ”°λΌμ„œ ‘’or’’=’’ λŠ” 항상 참이 λ˜λŠ” λ¬Έμž₯인 것이닀. λ”°λΌμ„œ password 에 true κ°€ 전달 λ˜λ©΄μ„œ admin 계정에 access ν•  수 μžˆμ—ˆλ˜ 것이닀.

μœ„μ—μ„œ λ³Έ 것 처럼 μ‚¬μš©μžκ°€ μž…λ ₯ν•˜λŠ” string 이 κ·ΈλŒ€λ‘œ sql query 에 λ“€μ–΄κ°€κ²Œ λœλ‹€λ©΄ password 에 true 값을 전달할 수 있게 λœλ‹€. κ·Έλ ‡λ‹€λ©΄ 인증이 뚫리게 λ˜λŠ” 취약점을 λ°œμƒμ‹œν‚€λŠ” 것이닀.

κ·Έλ ‡λ‹€λ©΄ user input 을 κ·ΈλŒ€λ‘œ μ „λ‹¬ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ 취약점이 λ°œμƒν•˜μ§€ μ•ŠλŠ” 것이 μ•„λ‹Œκ°€ ? λ§žλ‹€. λ‹¨μˆœν•œ true 값을 μ „λ‹¬ν•˜λŠ” 그것을 막을 수 μžˆλŠ” 방법이 λ‹€μŒ λ¬Έμ œμ—μ„œ λ“±μž₯ν•œλ‹€.


B) Solve the problem ([Injection Flaws] - [LAB: SQL Injection] - [Stage 2: Parameterized Query #1]). (20 p

문제의 λͺ…μ‹œ 사항은 block sql injection using parameterized query, verify that the attack is no longer effective

μ•žμ„œ λ§ν•œ κ²ƒμ²˜λŸΌ stage 2 의 λ¬Έμ œλŠ” stage 1 의 string injection 을 λ§‰λŠ” 것 이닀. λ˜ν•œ 취약점이 μ‹€μ œλ‘œ 보완이 λ˜μ—ˆλŠ”μ§€ λ˜ν•œ ν™•μΈν•œλ‹€.

μ£Όλͺ©ν•΄μ•Όν•  점은 using parameterized queryλ§€κ°œλ³€μˆ˜λ‘œ 된 쿼리λ₯Ό μ΄μš©ν•˜μ—¬ injection 을 λ§‰μœΌλΌλŠ” 것 이닀. 생각해보면 μœ„μ—μ„œ ν™•μΈν•œ sql λ¬Έμž₯의 경우 user 의 input 을 κ·ΈλŒ€λ‘œ μ‚¬μš©ν–ˆλ‹€. κ·Έλ ‡λ‹€λ©΄ λ§€κ°œλ³€μˆ˜λ‘œ 된 query κ°€ μ•ˆμ „ν•˜λ‹€λŠ” 말이 λ˜κ² λ‹€.

이 취약점은 query λ₯Ό μ²˜λ¦¬ν•˜λŠ” java νŒŒμΌμ— μ‘΄μž¬ν•œλ‹€. Login κ³Ό κ΄€λ ¨ 된 login .jsp νŒŒμΌμ„ μ°ΎλŠ”λ‹€.

Login java 파일의 login method κ°€ 보인닀. 듀어가보면 μš°λ¦¬κ°€ 둜그인 μž…λ ₯ μ‹œμ— μ‚¬μš© ν•œ query 문이 보인닀.

μ•žμ„œ λ§ν•œ 것 처럼 이 query λ¬Έμž₯μ—μ„œλŠ” μ‚¬μš©μžμ˜ μž…λ ₯ ( string) 을 κ·ΈλŒ€λ‘œ 집어 λ„£λŠ”λ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μ € 뢀뢄을 λ§€κ°œλ³€μˆ˜ ν™” ν•˜μ—¬ 값을 μ „λ‹¬ν•˜λŠ” λ°©λ²•μœΌλ‘œ μ ‘κ·Ό ν•΄μ•Ό ν•  것 이닀.

 μœ„μ—μ„œ 뢄석해 λ³Έ query λ₯Ό 쑰금 λ³€κ²½ν•œλ‹€. Where 절의 userid 와 password λŠ” 인자λ₯Ό κ·ΈλŒ€λ‘œ μ „λ‹¬ν•˜λŠ” 방식 μ΄μ˜€λŠ”λ°, ?, ? 둜 변경을 ν–ˆλ‹€. μ΄λŠ” 객체의 ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ κ·Έμ—κ²Œ 인자λ₯Ό μ „λ‹¬ν•˜λ €λŠ” 방식이닀.

κ·Έλ ‡κ²Œ ν•˜κΈ° μœ„ν•΄μ„œ 기쑴의 statement 객체λ₯Ό PreparedStatement 객체둜 λ³€κ²½ν•΄μ€€λ‹€.

 

κ·Έ 후에 인자λ₯Ό μ „λ‹¬ν•΄μ£ΌλŠ” ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€. 1,2 λŠ” ‘ ? ’ 둜 지정 ν•œ λ§€κ°œλ³€μˆ˜μ˜ μœ„μΉ˜λ₯Ό 인덱슀둜 ν‘œν˜„ ν•œ 것 이닀.

 

ExecuteQuery 문을 μ‚¬μš©ν•˜μ—¬ λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ 톡신을 ν•œλ‹€.

 

바뀐 μžλ°” μ†ŒμŠ€λ₯Ό λ³Ό 수 μžˆλ‹€. μ €μž₯을 ν•œ 후에 λ‹€μ‹œ 싀행해보도둝 ν•œλ‹€.

 

or’’=’ λ₯Ό μž…λ ₯ν–ˆλ”λ‹ˆ 둜그인 μ‹€νŒ¨κ°€ λ˜λŠ” 것을 μ•Œ 수 μžˆλ‹€.

쑰금 μ „ κΉŒμ§€λŠ” string 을 μ΄μš©ν•œ injection 이 μ„±κ³΅ν–ˆμ§€λ§Œ μ§€κΈˆμ€ login failed κ°€ λ°œμƒ ν•œ 것을 λ³Ό 수 μžˆλ‹€. Stage2 λ˜ν•œ μ„±κ³΅ν–ˆλ‹€.

 

 

Statement and Prepared Statement


κ·Έλ ‡λ‹€λ©΄ Statement 와 Prepared Statement λŠ” λ¬΄μ—‡μΌκΉŒ? ν•œλ²ˆ μ•Œμ•„λ³΄λ„λ‘ ν•œλ‹€.

λ¨Όμ € Statementλ₯Ό μ•Œ ν•„μš”κ°€ μžˆλ‹€.

κ·Έ ν˜•νƒœλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

String name= “ 홍길동”;

String memo =“ test memo, hong’s notepad”;

String priority = “1”;

String sql = String.format(“insert into tblMemo values(memoSeq.nextval,’%s’,’%s’,default,%s)”, name, memo, priority);

λ³΄μ΄λŠ” 것과 같이 일정 λ³€μˆ˜λ“€μ„ κ·ΈλŒ€λ‘œ sql query 에 μ‚½μž…ν•˜μ—¬ query 문을 λ§Œλ“œλŠ” 것을 λ³Ό 수 μžˆλ‹€. Injection 에 μ·¨μ•½ν•  수 μžˆλŠ” νŠΉμˆ˜λ¬Έμžμ— λŒ€ν•œ μ–΄λ– ν•œ μ •μ˜ 없이 string 을 κ·ΈλŒ€λ‘œ λ„˜κΈ΄λ‹€. Stage1,2 μ—μ„œ λ³Ό 수 μžˆμ—ˆλ˜ ‘’or’’=’’ 와 같은 곡격이 λ¨Ήν˜€λ“€ 수 μžˆλŠ” λ¬Έμž₯이닀.

 

κ·Έλ ‡λ‹€λ©΄ preared Statement λŠ” μ–΄λ–¨κΉŒ ? μœ„μ—μ„œ λ³Έ κ²ƒμ²˜λŸΌ λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€.

 

λ³΄μ΄λŠ”κ²ƒκ³Ό 같이 pstat 객체λ₯Ό μ΄μš©ν•˜μ—¬ sql λ¬Έμž₯을 μΈλ±μŠ€μ— 따라 μ±„μš°κ³  μžˆλ‹€.

java.sql.PreparedStatement λŠ” java.sql.Statement와 λ™μΌν•œ κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€. 차이점 이 μžˆλ‹€λ©΄PreparedStratementλŠ” SQL 쿼리의 틀을 미리 생성해 놓고 값을 λ‚˜μ€‘μ— μ§€μ •ν•œλ‹€λŠ” 것이닀.

좜처 : https://sas-study.tistory.com/160



C) Solve the problem ([Injection Flaws] - [LAB: SQL Injection] - [Stage 3: Numeric SQL Injection]). (20 pts)

문제 C 의 κ²½μš°λŠ” larry 둜 λ‘œκ·ΈμΈν•˜μ—¬ sql injection 을 μ΄μš©ν•΄ Neville 의 ν”„λ‘œν•„μ„ λ³΄λŠ” 것이닀. λ¬Έμ œκ°€ 생겼닀. κ°•μ˜μ—μ„œ λ³Έ λŒ€λ‘œλΌλ©΄ Larry Stooge 의 password λŠ” ‘Larry ‘κ°€ λ§žμ„ν…λ° 둜그인이 μ•ˆ λœλ‹€. μƒˆλ‘œμš΄ λ°©λ²•μœΌλ‘œ injection ν•΄μ•Ό ν•  것 κ°™λ‹€.

주석을 μ΄μš©ν•˜λŠ” λ°©λ²•μœΌλ‘œ 도전 해보도둝 ν•œλ‹€.

Query 의 password κ°€ λ“€μ–΄κ°ˆ μžλ¦¬μ— ‘’or1=1 – 이 듀어가도둝 ν•˜κ² λ‹€. Sql λ¬Έλ²•μ—μ„œλŠ” ‘- -‘ λŠ” 이후가 μ£Όμ„μ²˜λ¦¬ λœλ‹€.

μ‹€νŒ¨ν–ˆλ‹€. μ•ˆλ μ΄μœ κ°€ 없을 것이닀. μžλ°” νŒŒμΌμ•ˆμ˜ 둜그인 query λŠ” μœ„μ—μ„œ λ³Έ 것 처러 select * from employee where userid ? and password ? ; κ°€ λ§žμ„ν…Œλ‹ˆκΉŒ. μ΄ν΄λ¦½μŠ€μ—μ„œ system 좜λ ₯으둜 μ„œλ²„μ— 전달 된 queryλ₯Ό ν™•μΈν•΄λ³΄μž.

 - κ°€ ν•œκ°œλ°–μ— 듀어가지 μ•Šμ•˜λ‹€. μ•„λ¬΄λž˜λ„ κΈ€μžμˆ˜ μ œν•œμ΄ μžˆλŠ” 것 κ°™λ‹€. κΈ€μžμˆ˜ μ œν•œμ„ μ—†μ•  보도둝 ν•˜κ² λ‹€

μ˜ˆμƒμ΄ λ§žμ•˜λ‹€. Maxlegth κ°€ 8둜 λ˜μ–΄ μžˆμ—ˆκ³ , λ‚΄κ°€ μž…λ ₯ν•œ ‘’or1=1—λŠ” 9 κΈ€μžμ˜€λ‹€. μ•žμœΌλ‘œλ„ injection 이 μˆ˜μ›” ν–ˆμœΌλ©΄ μ’‹κ² λ‹€. Maxlength λ₯Ό 없애도둝 ν•˜κ² λ‹€.

이런 λ…Έλ ₯에도 둜그인이 λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. 였λ₯˜ ꡬ문은 java.sql.SQLException 으둜 sql ꡬ문에 λ¬Έμ œκ°€ μžˆλ‹€λŠ” 것이 μ˜€μŠ΅λ‹ˆλ‹€. Sql ꡬ문을 λ°”κΎΈκ³ , 섀정을 바꿔도 해결이 λ˜μ§€ μ•Šμ•„ λ‹€λ₯Έ νŒŒμΌμ— 있던 login ν•¨μˆ˜λ₯Ό κ·ΈλŒ€λ‘œ 볡사 λΆ™μ—¬ λ„£κΈ° ν•˜μ—¬ 둜그인 문제λ₯Ό ν•΄κ²° ν–ˆμŠ΅λ‹ˆλ‹€.

 

Larry 의 ν”„λ‘œν•„λ‘œ 둜그인이 된 것을 확인 ν•  수 μžˆλ‹€.

이제 burpsuite λ₯Ό μΌœμ„œ ViewProfile μš”μ²­μ„ 보낼 λ•Œ μ‘°μž‘μ„ 해보도둝 ν•˜κ² λ‹€.

POST method 둜 ViewProfile 을 μš”μ²­ν•œ 것을 λ³Ό 수 μžˆλŠ”λ°. μ΄λ•Œ employee_id κ°€ 101 이고, μ΄λŠ” larry 의 employee_id 이닀.

Java νŒŒμΌμ„ 확인해보면 101 이 첫번째 employee_id value μž„μ„ μ•Œ 수 μžˆλ‹€. Select query 의 경우 κ°€μž₯ μƒμœ„μ— λ‚˜νƒ€λ‚˜λŠ” κ²ƒλ§Œ 반영 되기 λ•Œλ¬Έμ—, 이처럼 λ§ˆμ§€λ§‰ 뢀뢄이 ν•„μš”ν•œ μƒν™©μ—μ„œλŠ” Order by ꡬ문을 μ΄μš©ν•˜μ—¬ μ—­μˆœμœΌλ‘œ 뒀집어주어야 ν•œλ‹€.

employee_id 에 ν•΄λ‹Ήν•˜λŠ” body 값을  101 or 1=1 order by employee_id desc 둜 λ°”κΏ”μ£Όκ³  μš”μ²­μ„ μ „μ†‘ν•œλ‹€.

λ³΄μ΄λŠ” 것 처럼 Larry 의 μ•„μ΄λ””λ‘œ 둜그인 ν•œ μƒνƒœμ§€λ§Œ, ViewProfileμ—μ„œ Neville 의 ν”„λ‘œν•„μ„ λ³΄λŠ” κ²ƒμ²˜λŸΌ μ„±κ³΅ν•œ λͺ¨μŠ΅μ„ λ³Ό 수 μžˆλ‹€.

 

μ„±κ³΅ν•œ 것을 λ³Ό 수 μžˆλ‹€. 

 

Order by ? desc ?


SQL 의 Order by μ ˆμ€ SELECT 문으둜 검색 된 데이터λ₯Ό μ˜€λ¦„μ°¨μˆœ (ASC) λ‚˜ λ‚΄λ¦Όμ°¨μˆœ (DESC) 둜 μ •λ ¬ μ‹œν‚¬ λ•Œ μ‚¬μš© ν•œλ‹€. Default 값은 ASC 둜써 μƒλž΅ κ°€λŠ₯ν•˜λ©° Order by μ ˆμ— 선택 된 컬럼이 μ—¬λŸ¬ 개일 경우 μ•žμ— μ •μ˜ 된 μ»¬λŸΌμ„ κΈ°μ€€μœΌλ‘œ λ¨Όμ € μ •λ ¬ν•œλ‹€.



D) Solve the problem ([Injection Flaws] - [LAB: SQL Injection] - [Stage 4: Parameterized Query #2]). (20 pts)

Stage 4 λŠ” stage 3 의 λ¬Έμ œμ μ„ ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ†ŒμŠ€μ½”λ“œλ₯Ό μˆ˜μ •ν•˜λŠ” λ¬Έμ œμ΄λ‹€.

μš°λ¦¬λŠ” eclipse λ₯Ό ν†΅ν•΄μ„œ μ†ŒμŠ€μ½”λ“œλ₯Ό ν™•μΈν•˜κ³  μˆ˜μ •ν•  수 μžˆλ‹€. ViewProfile μ—μ„œ μ μ ˆν•˜κ²Œ injection 을 막아보도둝 ν•œλ‹€. Eclipse 둜 ViewProfie μ—μ„œ submit 에 κ΄€ν•œ 정보λ₯Ό μ°ΎλŠ”λ‹€.

Submit 을 λˆ„λ₯΄λ©΄ SQLinjection.LISTSTAFF_ACTION 이 μ‹€ν–‰ λœλ‹€.

κ·Έ μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” java 파일이  λ‹€μŒκ³Ό 같은 ViewProfile 파일 이닀.

 

이 파일 μ•ˆμ˜ μ·¨μ•½ν•œ ν•¨μˆ˜λŠ” Stage2 와 같은 Statement 객체λ₯Ό μ‚¬μš©ν•œselect sql ꡬ문이닀. Stage2와 λ§ˆμ°¬κ°€μ§€λ‘œ PreparedStatement 객체λ₯Ό μ‚¬μš©ν•˜λŠ” λ§€κ°œλ³€μˆ˜λ₯Ό μ΄μš©ν•œ ꡬ문으둜 λ°”κΎΈμ–΄μ€€λ‹€.

μ·¨μ•½ν•œ query λ₯Ό PreparedStatement λ₯Ό μ‚¬μš©ν•˜μ—¬ 보완 ν•œ λͺ¨μŠ΅μ΄λ‹€. μ €μž₯ν•˜μ—¬ μ„œλ²„μ— λ³€κ²½ 된 μ½”λ“œλ₯Ό μ μš©μ‹œν‚¨ 후에 λ‹€μ‹œ stage 3 μ—μ„œ ν–ˆλ˜ 것 처럼 burp suiteμ—μ„œ salary 의 값을 μ‘°μž‘ν•΄ Neville 의 정보λ₯Ό μ‘°νšŒν•˜λ„λ‘ ν•΄λ³Έλ‹€.

 

μ—λŸ¬κ°€ λ°œμƒν•˜λ©° μ„±κ³΅ν•œ 것을 μ•Œ 수 μžˆλ‹€. κ°•μ˜μ—μ„œ ν–ˆλ˜ 것 처럼 An error has occurred λ₯Ό Don’t try SQL injection으둜 λ°”κΏ€ μˆ˜λ„ μžˆλ‹€.

 

 

BurpSuite μž‘λ™ μ•ˆν•  λ•Œ


이번 챕터λ₯Ό μ§„ν–‰ν•˜λ©΄μ„œ μ΄μœ μ—†μ΄ μ•ˆλ˜λŠ” κ²½μš°κ°€ λ„ˆλ¬΄λ‚˜λ„ λ§Žμ•˜λ‹€. 확인 ν•΄λ³Έ κ²°κ³Ό firefox κ°€ ν—ˆλ½ 없이 μ—…λ°μ΄νŠΈ λ˜μ–΄μ„œ 둜컬호슀트둜 ν”„λ‘μ‹œ μ„œλ²„λ₯Ό μ§€μ •ν•˜μ§€ λͺ»ν–ˆλ˜ 것 μ΄μ˜€λ‹€. Firefox λ₯Ό μ‚­μ œν•˜κ³ , 재 μ„€μΉ˜ ν›„μ˜΅μ…˜μ—μ„œ μžλ™ μ—…λ°μ΄νŠΈ κΈ°λŠ₯을 ν•΄μ œν–ˆλ‹€.

μ•žμ„œμ„œ ν•œ λͺ¨λ“  μ‹€μŠ΅λ“€μ΄ Statement 객체λ₯Ό μ΄μš©ν•˜μ—¬ λ°œμƒν•œ 취약점 λ•Œλ¬Έμ΄μ—ˆλ‹€. PreparedStatement λ₯Ό μ‚¬μš©ν•  ν•„μš”κ°€ μžˆλ‹€. μ‹€μ œ μ„œλΉ„μŠ€μ—μ„œλ„ PreparedStatement λ₯Ό μ‚¬μš©ν•˜λŠ”μ§€ 그렇지 μ•ŠμœΌλ©΄ 더 μ•ˆμ „ν•œ 객체λ₯Ό μ‚¬μš©ν•˜λŠ”μ§€ μ•Œμ•„λ³΄λ„λ‘ ν•΄μ•Όκ² λ‹€.


 

 

E) Solve the problem ([Injection Flaws] - [Database Backdoors]). (20 pts) - Solve step1 & step2 problem.

E 번 문제의 경우 Database 에 Backdoorλ₯Ό μ„€μΉ˜ν•˜λŠ” κ²ƒμœΌλ‘œ 보인닀. Sql λ¬Έλ²•μ—μ„œ TRIGGER λΌλŠ” 문법이 μžˆλŠ”λ° νŠΉμ • ν…Œμ΄λΈ”μ— INSERT,DELETE,UPDATE 같은 DML문이 μˆ˜ν–‰ λ˜μ—ˆμ„ λ•Œ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μžλ™μœΌλ‘œ μž‘λ™ν•˜λ„λ‘ μž‘μ„±λœ ν”„λ‘œκ·Έλž¨ ( μ½”λ“œ ) 이닀. μ‚¬μš©μžμ˜ 호좜이 μ•„λ‹ˆλΌ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μžλ™μœΌλ‘œ ν˜ΈμΆœν•˜λŠ” 것이닀.

 

UserId 에 larry 의 userid 인 101 을 집어 λ„£μ—ˆλ”λ‹ˆ larry 에 κ΄€ν•œ 정보가 λ‚˜μ™”λ‹€.

그리고 UserID 에 μžˆλŠ” select ꡬ문이 μ‹€ν–‰ λœλ‹€λŠ” 것을 λ³΄μ—¬μ£ΌλŠ” 것 κ°™λ‹€.

λ°”λ‘œ 101; 이후에 query κ°€ μž‘λ™ν•˜λŠ” 것을 λ³Ό 수 μžˆλ‹€. Update λ¬Έμž₯을 ν†΅ν•΄μ„œ larry 의 정보λ₯Ό μ‘°μž‘ν–ˆλ‹€.

 

Stage1 을 clear ν–ˆλ‹€. λ°”λ‘œ λ‹€μŒ Stage2 둜 λ„˜μ–΄μ˜€λ©΄μ„œ Stage2 에 κ΄€ν•œ μ„€λͺ…이 λ‚˜μ˜¨λ‹€. String SQL Injection 을 μ΄μš©ν•΄ 백도어λ₯Ό μ„€μΉ˜ν•˜λŠ” 것이닀. CREAT νŠΈλ¦¬κ±°λŠ” “CREAT TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email=’john@hackme.com’ where userid = NEW.userid”

이닀. 짚고 λ„˜μ–΄κ°ˆ ν•„μš”κ°€ μžˆλ‹€

 

CREAT TRIGGER


μ•žμ„œ λ§ν•œ 것 처럼 트리거λ₯Ό μƒμ„±ν•˜λ©΄ μ§€μ •λœ SQL 문이 μ‹€ν–‰  될 λ•Œ λ‹€λ₯Έ SQL 문을 μžλ™μœΌλ‘œ μˆ˜ν–‰ν•  수 μžˆλ‹€. 트리거λ₯Ό μƒμ„±ν•˜λŠ” ν˜•μ‹μ€ λ‹€μŒκ³Ό κ°™λ‹€.

κ·Έλ ‡λ‹€λ©΄ μš°λ¦¬κ°€ WebGoat μ—μ„œ μž‘μ„±ν•œ SQL 문을 ν™•μΈν•΄λ³΄μž

1)    CREAT

μƒμ„±ν•˜λŠ” λͺ…령어이닀. κ²½μš°μ— 따라 Table 을 생성할 μˆ˜λ„ μžˆμ§€λ§Œ μ΄κ²½μš°λŠ” TRIGGER  λ₯Ό CREAT ν•˜λŠ” κ²½μš°μ΄λ‹€.

2)    TRIGGER –

CREAT 에 ν•΄λ‹Ήν•˜λŠ” 인자둜 TRIGGER λ₯Ό μƒμ„±ν•˜κ² λ‹€λŠ” λͺ…령어이닀. λ°”λ‘œ λ’€μ—μ˜€λŠ” string 은 trigger 의 이름을 μ˜λ―Έν•œλ‹€.

3)    BEFORE

트리거의 쑰건 μ˜μ—­κ³Ό μ‹€ν–‰ μ˜μ—­μ΄ μ‹€ν–‰ λ˜λŠ” μ‹œμ μ„ μ§€μ •ν•˜λ©° BEFORE,AFTER,DEFERRED κ°€ μžˆλ‹€.

4)    INSERT

쑰건 μ˜μ—­κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ INSERT 될 λ•Œ μž‘λ™ν•œλ‹€λŠ” μ˜λ―Έμ΄λ‹€. μΈμžλ‘œλŠ” INSERT ,UPDATE, DELETE κ°€ μžˆλ‹€.

5)    ON –table—

INSERT λ°”λ‘œ 뒀에 λ‚˜μ˜¨ μž…μžλ‘œ μ–΄λ–€ ν…Œμ΄λΈ”μ— ν•΄λ‹Ή ꡬ문이 μž‘λ™ν•˜λŠ”μ§€ μ§€μ •ν•˜λŠ” μœ„μΉ˜μ΄λ‹€.

6)    FOR EACH ROW

각 행에 ν•΄λ‹Ή TRIGGER λ₯Ό μ μš©ν•œλ‹€λŠ” μ˜λ―Έμ΄λ‹€.

7)    BEGIN

μ‹€μ œ μž‘λ™ν•  μ½”λ“œκ°€ 이 뒀에 λ‚˜νƒ€λ‚œλ‹€.

8)    UPDATE employee SET email=’john@hackme.com’ where userid = NEW.userid”

TRIGGER μ—μ„œ μ‹€μ œ μž‘λ™ ν•  μ½”λ“œλ“€μ΄λ‹€.


이제 μ‹€μ œλ‘œ User ID 에 μž…λ ₯을 해보도둝 ν•˜μž.

101; CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='john@hackme.com'WHERE userid = NEW.userid  λ₯Ό μž…λ ₯ ν•΄μ£Όμ—ˆλ‹€.

λ§ˆμ§€λ§‰ μ‹€μŠ΅κΉŒμ§€ μ„±κ³΅ν•œ λͺ¨μŠ΅μ„ λ³Ό 수 μžˆλ‹€.

 

자료 좜처

λ‚˜μ˜ λΈ”λ‘œκ·Έ

https://limkydev.tistory.com/154