SQL injection/lord of SQL

Lord Of SQL injection 26단계-red_dragon

ys.k 2022. 1. 15. 20:10

LOS 포스팅에 앞서 내용이 틀릴 수도 있으며, 해당 부분 지적은 감사히 받겠습니다.

26단계 소스코드이다.

파라미터로 id와 no값을 받는다.

id는 7글자가 넘으면 안 되며 no는 삼항 연산자와 is_numeric 함수로 데이터 타입이 숫자형이면 그대로 값을 주고 숫자형이 아니면 1로 값을 고정시켜준다.

1. 삼항 연산자 : (조건)?a:b // 조건이 참이면 a를 반환하고 거짓이면 b를 반환한다.

2. is_numeric(a) // a가 숫자이면 true를 반환하고, 아니면 false를 반환한다.

 

문제 해결 조건은 admin의 no값을 올바르게 넣으면 된다.

이번 문제도 인터넷의 힘을 빌렸다...

처음엔 no뒤에 hex방식 등으로 삽입하는 줄 알았는데 작동하지 않았다.

no값에 2를 넣으면 정상적으로 query에 2로 출력되지만

hex로 입력했을 때는 is_numeric() 함수에 걸리는 모습이다.

마찬가지로 0b도 똑같이 먹히지 않았다.

no뒤에는 숫자밖에 올 수 없으니 id파라미터에서 가능하도록 해야 한다.

인터넷에서 조금 더 찾아보니 is_numeric() 에는 공백 문자열은 탐지하지 않는다 한다.

공백 문자열을 삽입했음에도 1이 아닌 사용자가 입력한 3이 출력된다.

이를 통해 # 와 % 0a를 응용할 수 있게 된다.

바로 쿼리를 작성한다.

id는 7글자 이하로 작성해야 하니? id='||no>%23&no=%0a1 // 주석처리를 통하여 and no=' 부분을 주석 처리하고 no의 첫 번째에 줄 바꿈 문자(%0a)를 삽입하여 no값을 유효시켜준다.

이제 no에 숫자만 넣어도 공격이 가능하도록 만들어 주었다.

일단 수동으로 no의 자릿수를 찾아낸다.

no의 값은 100,000,000보다는 크고 1,000,000,000보다는 작다.

바로 이진 검색 인젝터를 돌려준다.

no는 586482014이다.

문제 해결!

시행착오

1. is_numeric() 함수는 공백문자열은 사용할 수 있으며 이를 이용해 주석처리 우회를 할 수있다.

2. 삼항연산자에 대해 배웠다. ex) (조건)?a:b // 조건이 참일경우 a 반환하고 거짓일 때 b를 반환 추후에 if를 대신해서 사용할 수 있는지 테스트 해봐야 겠다.