webhacking.kr 39번

그냥 제출을 눌러도 아무것도 안 뜨고 임의의 값을 입력해도 아무것도 뜨지 않는다.

소스를 살펴보겠다.

sql 인젝션 문제다.

전달방식은 post이기 때문에 이번엔 url 입력을 사용할 수 없을거 같다.

 

str_replace(a, b, 문자열) : 문자열의 모든a를 b로 치환한다.

id에 \\가 있다면 사라질것이고 '가 있다면 ''로바뀐다.

 

substr(문자열, a, b) : 문자열의 a위치부터 b개수 만큼 추출한다. b가 음수이면 위치를 뜻하고 그 위치 전까지 추출한다. b가 없다면 문자열의 끝까지 출력한다.

0의위치부터 15개만큼 추출함을 알 수 있다.

 

select 1 form member where length(id)<14 and id='~ id의 길이가 14미만이어야 한다.

 

id에 임의의값' 을 입력해주면 될듯한데 그냥 입력하면 '이 ''로 치환되는 문제가 생기기 때문에 여전희 따옴표가 짝이 맞지 않는다.

 

한가지 궁금한 점이 생겼는데 select 1이 대체 뭐지? 싶었다.

내가 학교에서 sql을 배울때 select 뒤에는 필드명이 와야한다고 배웠는데 1은 필드명이 될 수 없다. 그렇다면 이 1은 대체 뭔가?

또 열심히 구글링을 했다.

도움이 된 블로그들

m.mkexdev.net/427

codedragon.tistory.com/5885

m.blog.naver.com/ykm_m/221162187121

 

내가 문제를 풀면서 궁금했던 부분만 간단히 정리하겠다.

select 1 from 테이블명 where~

테이블의 행개수 만큼 1로된 행을 출력한다.

테이블의 행의 수가 n개면 1이 n행만큼 반환된다.

여기서 1은 true를 의미.

where 조건문과 함께 쓰면 해당 조건을 만족하면 1을 반환하게 된다.

 

이 문제에선

길이가 14미만이며 id가 admin인 조건을 만족한다면 1을 출력하는게 되겠다.

따라서 result에 1이 n개인 행이 들어갈 것이고(내가 이 member라는 테이블에 정확하게 몇개의 행이 있는지 모르므로)

result[0]은 1이 될것이다.

 

다시 문제로 돌아와서

admin'을 입력해주려면 substr을 이용해야한다.

15번째 글자부터는 자동으로 잘리게 되므로 공백을 이용해 길이를 늘려준다.

admin         '

를 입력해주면 admin 5글자 공백 9글자 ' 1글자 해서 15개의 문자열이 만들어진다.

이 문자열이 치환되어

admin         ''이 되어도 뒤의 '는 자동으로 잘려서 쿼리문이 완성된다.

 

입력창에 입력후 제출하면 끝

'문제풀이 > 보안 writeup' 카테고리의 다른 글

SuNiNaTaS(써니나타스) 4번  (0) 2021.07.01
SuNiNaTaS(써니나타스) 7번  (0) 2021.05.24
webhacking.kr 45번  (0) 2021.04.08
webhacking.kr 38번  (0) 2021.04.08
webhacking.kr 7번  (0) 2021.04.08
myoskin