학원

2023/07/27 SQL Injection

맹진호 2023. 7. 27. 17:23


저번에 했던 실습 풀어주는 느낌


[ 문제 1 ] 나이가 가장 많은 회원의 이름을 조회하라

select name
from member
where age = (select max(age) from member)

조회니까 select문을 사용하는게 맞다.
회원이름이니까 name을 줘야하고 member을 해야함
가장 많은 나이를 조건으로 해야하기 때문에 나이가 많다는걸 그냥 써보고 그걸
where에 조건으로 준다.
하위에 있는 쿼리문부터 작성한다.



[ 문제 2 ] 모든 회원들의 나이를 7살 높여라

update member
set age = age+7

특정 조건이 없기 때문에 where을 딱히 사용하지 않고 해준다.



[ 문제 3 ] id 중에 's'가 들어가는 회원의 tuple을 삭제하라

delete from member
where user_id like '%s%'

여기서 말하는 tuple은 row라고 생각하면 될듯
삭제하는 구문이기 때문에 delete를 사용함
id에 s들어가는 회원을 찾는거기 때문에 like를 사용해준다.



[ 문제 4 ] 이름 중에, '지'가 들어가는 회원의 모든 정보를 조회하라
단, 나이와 이름을 내림차순으로 정렬하라.

select *
from member
where name like '%지%'
order by age desd, name desc

조회니까 select문을 사용하면 될것이다.
모든 정보니까 *을 사용해줌
다시 조건을 확인해보면 지가 들어가는거니까 3번문제랑 비슷하다
그리고 정렬을 진행하려면 아래에 order by로 해준다.



[ 문제 5 ] 나이가 30이하인 회원들을 그룹별로 인원수를 조회하라

select age, count(age) as 인원수
from member
group by age
having aje<=30

조회니까 똑같이 select문이 들어가면 될거같다.
조회를 해볼꺼기 때문에 count를 사용해준다.
그룹 바이를 할꺼기 때문에 where은 딱히 필요하지않을 것
표를 확인했을 때 이름이 없기 때문에 as 인원수도 붙여준다.

 


[ 문제 6 ] 성이 '김'씨인 회원의 성을 '이'씨로 변경하라

update member
set name = '이' + substring(name, 2, 2)
where substring(name, 1, 1)='김'

변경하는거기 때문에 update를 사용한다.
조건을 보면 김씨를 이씨로 변경하는거기 때문에 김씨를 where절로 이씨를 set으로 오면 된다.
김이라는 건 where절에 첫번째 문자를 추출한다. 이럴 땐 substring을 사용해준다.
맨 앞자리만 바꿔주고 뒷자리 이름은 똑같이 주면 되겠다. 그리고 이를 더해서 name에 저장하겠다는 뜻이다.






강사님이 주신 파일 다운받아주고
기존의 80번 포트를 해제해주기 위해서 
services.msc를 검색해서 APM_APACHE2와 APM_MYSQL5를 중지 시켜줌.

 

 

그리고 localhost/WebGoat/attack으로 들어가줌 이름과 패스워드는 webgoat이다.

 

 

왼쪽에 Injection을 보고 Numeric SQL Injection을 눌러준다.
주어진 SQL문이 있는데 추가적으로 삽입해서 원하는 결과를 가져옴

이 사이트는 문제가 하나씩 출력되고 문제에 맞는 답을 입력하고 다음 문제로 넘어가는 형식이다.
모든 크레딧카드 넘버를 출력해야한다. SQL 구문에 데이터를 입력해서 원하는 답을 입력해야함

102 or 1=1을 하게 되면 모든 크레딧 카드가 출력되게 됨
userid = 102랑 묶게되고 1=1로 묶어서 둘다 True로 만들게 되는 것.
우리가 봐야할 곳은 where절의 영향을 미치는 것이다.
where절을 그냥 참으로 나오게 만들었기 때문에 SELECT * From user_data가 그냥 출력되는 것이다. 그냥 출력되었기 때문에 모든것들이 출력되었다.

다음 문제는 String SQL Injection으로 들어가서 해결해줌
아무 답을 적게되고 Go! 를 누르게 되면 양쪽에 ''가 나오게된다.
그렇기 때문에 Smith' or '1=1로 답을 입력해주게되면 ''로 묶여져서 답을 출력하게 된다.
그렇게 되면 True로 나오기 때문에 모든 컬럼을 출력하게 된다.


 

마찬가지로 강사님 파일에서 5.4버전을 가져와서 아까 했던거 처럼 이번에는 WebGoat 5.4버전으로 들어와서 설치를 해준다. 그리고 webgoat를 눌러주고 아까 들어왔던 사이트 localhost/Webgoat/attack으로 들어와줌


 

아까 처럼 왼쪽에서 LAN SQL Injection을 클릭해주고 들어와서 문제를 풀어본다
SQL은 원래 뜨지않고 생각해야하는 부분이다.
아마도 password가 있고 이름이 있는게 보이니까 아마

select
from
where id='Neville' and pw='??'
이런식의 형태일 것이다. 


where id='Neville' and pw='1' or '1'='1'
이런 형식으로 우회가 가능하다는걸 볼 수 있다
실제로 적으면 1' or '1'='1를 적을 수 있을 듯 근데 복사해서 넣게되면
들어갈 수 있는 최대 수가 8자밖에 안되기 때문에 프록시를 켜서 paros에서 로그인할 때 넘기는 패킷을 잡아줘서 아까 복사한걸 넣게 되면 넘어간것을 확인할 수 있음


 

두번째 문제는 Database Backdoors이다.
이것은 SQL그문을 더 써서 확인해보면 되는것이고 ID는 101번이다.
SQL이 어떤식으로 쓰는지도 다 나와있다.

 

 

101;
update employee
set salary=99999
where userid=101
이런느낌일텐데 엔터를 없애고 옆으로 쭉 쓰게 되면 해결할 수 있음
이 문제는 문제를 잘 읽어봤으면 아마 풀 수 있는 문제였을 것이다.

 

 

실제 우리 사이트에 와서 활용을 할 수 있을 것이다.
아이디는 알고있다는 가정하에 비밀번호는 1' or '1'='1을 작성해주면 로그인이 된다.


 

C드라이브로 들어와서 Inetpub에 webhack여기로 들어오고 member에 member_login_check을들어오게 되면 여기서 
select user_id, user_pw, name, email, homepage 
from member 
where user_id='"&id&"' and user_pw='"&password&"'
부분을 복사해서 가져왔다. 이 부분을 통해서 살펴보자면

where user_id='nuno' and user_pw='1'or'1'='1'
MSsql은 and가 우선순위가 더 높다.
그렇기 때문에 앞에 있는 and부터 하게 되면 nuno부분은 T이고 뒷부분은 F기 때문에
and는 하나만 F가 나와도 F로 취급이 되는 것
where F or '1'='1'
이 되는것이고 or은 F가 나와도 뒷부분이 T라서 T로 되게 된다.
where T 이런식으로 된 것
그래서 사실상 없다고 봐도 무방하다.
이렇기 때문에 이렇게 로그인이 되면 서버 쿼리에 있는 맨 위에 있는 아이디로 로그인이 된다 


[ 실습 1 ]

- Webhack 사이트의 로그인 페이지에서 SQL Injection을 이용해 로그인하라

- GET 방식을 통해 로그인하라

GET방식으로 해야한다고 하면
http://192.168.1.20/member/member_login_check.asp?user_id=nuno&user_pw=dlaudtn
을 URL에 넣어준다.


강사님이 알려주는 방식은 내일 알려주신다고 함