K-Shield 주니어/웹 해킹 기초

K-shield 주니어 4일차(2025-03-31 월요일)

pkse74 2025. 3. 31. 14:03

오늘 오전에는 WebGoat에서 Sql인젝션 실습을 하였다

준비물 : WebGoat 사이트, BurpSuite 프로그램

첫 번째 실습은 String sql 인젝션이다

목적 : sql 인젝션을 활용해 인증을 우회해서 관리자인 Neville 로 로그인 하라 이다

String sql injection 은 

서버DB가 where 조건문에서 ' ' 로 문자열 취급을 할때 우회하게 하는 인젝션이다

Larry 라는 박스칸을 선택해보면 누구로 로그인 할지 선택 할수 있다

Neville로 로그인 하려기 때문에 Neville로 바꿔준다

그러고 2번을 보면 password=1234 라고 되어있는데 당연히 이렇게 로그인하면 실패한다 진짜 비밀번호가 아니기 때문에

그러면 password를 우회하기위해서 password 부분에 string sql injection 을 주입해본다

string sql injection은 password부분이 where password='1234' 이런식으로 전송이 되기때문에

이것을 우회하려면 ='[1234' or '1'='1]' 대괄호 안처럼 넣어야 ='1234' or '1'='1' 형식으로 1234 또는 true 가 되기때문에

비밀번호 우회가 가능한것이다

Nevile로 로그인되서 스테이지가 클리어 된걸 볼수가있다.

두 번째 실습은 Numeric 인젝션이다

 

목적은 '정규직원' 인 Larry로 로그인해서 상사인 'Neville' 의 프로필을 보는게 목적이다

우선 Larry로 로그인을 해야하는데 비밀번호를 모르니 String sql injection 을 사용해 로그인해준다

문제에서 View function을 sql injection을 이용해 Neville의 프로필을 찾아보라고 하니 

-ViewProfile을 누르는걸 인터셉트 잡아보면

employee_id 가 101 인걸 확인할수 있다.

여기서 id를 neville의 id로 바꾸면 해결될거같지만 해결되지 않는다

그래서 내림차순을 이용해 찾아낼거다

Larry는 101번이고 Neville의 id는 112다 ( 첫 번째 실습때 id를 알아냈다)

numeric sql injection 으로 101 or 1=1 무조건 참을 만들어내면 모든 employee_id의 viewprofile을 보는것인데

뒤에 order by employee_id desc로 내림차순을 넣음으로써 마지막 순서인 id인 Neville의 프로필이  나올것이다

Larry의 계정이지만 Neville의 프로필을 볼수가 있다

 

세 번째 실습인 Blind Sql injection

블라인드 인젝션은 참 거짓을 활용해 응답을 비교해가면서 원하는 데이터를 알아내는방법이다

목적은 1111222233334444라는 cc_number를 가진 테이블pins의 pin 필드를 확인하려는것이다

101이 적혀있는데 응답이 valid라고 나와있기때문에 참 거짓의 응답을 비교해보려고 입력창에다가

101 and ((select pin from pins where cc_number=1111222233334444) > 1000)

을 넣어본다

그럼 여전히 valid라는 응답이온다 그럼 1000을 2000 3000 4000 이렇게 노가다해서 범위를 좁혀보면

101 and ((select pin from pins where cc_number=1111222233334444) > 2363) 은 valid

101 and ((select pin from pins where cc_number=1111222233334444) > 2364) 은 invalid 로 나온다

그렇다는건 2364가 정답이 되는것이다

 

네 번째 실습인blind string sql injection

목적은 cc_number가 4321432143214321 인 pins테이블의 name을 알고 싶은것이다

그러면 블라인드 sql인젝션으로 

101 and (SUBSTRING((select name from pins where cc_number=4321432143214321)1,1) > 'A') 로 글자수를 알아본다

여기서 SUBSTRING으로 첫번째 글자 한개를 'A' 의 Ascii값으로 비교를해 65보다 큰지 비교해보고 참인지 거짓인지 판별해보는것이다

그렇게해서 노가다를해보면

101 and (SUBSTRING((select name from pins where cc_number=4321432143214321),5,1) >'A') 여기서 invaild드가 뜰것이다 그러면 4글자인것을 알수가 있고

101 and (SUBSTRING((select name from pins where cc_number=4321432143214321),1,1) >'B') 

101 and (SUBSTRING((select name from pins where cc_number=4321432143214321),1,1) >'C') 

.

.

.

.

이렇게 노가다를해서 한글자 한글자씩 찾아보면

Jill이라는 값이 나온다

 

다섯번째 실습으로 command sql injection 이다

- 사용자 입력 값이 운영체제 명령어의 일부 또는 전부로 구성되어 실행되는 경우, 의도하지 않은 시스템 명령어가 실행되어 부적절하게 권한이 변경되거나 시스템 동작 및 운영에 악영향을 줌

목적은 운영체제에 명령어를 주입 시키는 것으로 아무거나 View를눌러 어떻게 전달되는지 확인한다

저기 구문은 

ExecResults for '[/bin/sh, -c, cat "/root/.extract/webapps/WebGoat/plugin_extracted/plugin/CommandInjection/resources/AccessControlMatrix.html"]'
Output...

로 나오는데 리눅스 명령어 ls를 주입시키려고한다 그렇다면 ;ls 를추가시키면되는데 cat다음" 가 있으니

";ls; 를추가시키는데

뒤에 "도 있으니 #주석을 넣어 무시하자

그러면ExecResults for '[/bin/sh, -c, cat "/root/.extract/webapps/WebGoat/plugin_extracted/plugin/CommandInjection/resources/AccessControlMatrix.html";ls;#"]'
Output...

가된다 이걸 버프로 보내보자

 

추후 수정..