본문 바로가기

3. 웹 애플리케이션 취약점 진단137

lord of sql injection 30번 - ouroboros 이번 문제는 소스코드가 짧다. 바로 pw 관련 구문을 넣어보았지만 아무것도 뜨지 않는다. 아무래도 데이터베이스가 비어있어서 그런것 같다. 그래서 union select를 사용해보았다. union select를 사용하니 pw에 대한 값이 나왔는데 클리어를 하는 조건은 result pw와 get pw.. 즉, 자신이 쿼리에 작성한 입력값과 결과 값이 동일해야 한다는 뜻이다. 이걸 어떻게 해야하나 생각하다가 구글링을 해보니 SQL에 Quine 이라는 자신이 작성한 소스코드를 그대로 출력할수 있는 메타프로그램을 찾았다. 이 문제는 Quine을 이용해서 풀어야 할것 같다. https://en.wikipedia.org/wiki/Quine_(computing) Quine (computing) - Wikipedia F.. 2023. 12. 22.
lord of sql injection 29번 - phantom 이번 문제는 joinmail 값을 입력받아서 insert 구문을 수행하는 것을 이용해 취약점을 찾아 해킹해야한다. insert 구문의 취약점중 하나는 값을 검증하지 않으면 여러개의 열에 해당하는 값을 인젝션하여 악성 sql 구문을 넣을 수 있다는 것이다. 우선 joinmail과 email을 get 하길래 둘다 값을 넣어보았다. email은 의미없고 joinmail에 1을 넣으니 쿼리가 나왔다. value 0 값과 서버 remote address 값과 joinmail 값을 받아 테이블로 표시해 주는것 같다. 여기서 joinmail의 쿼리 뒤에 새로운 삽입문을 추가하여 no=1인 해답 이메일을 불러와보자. ?joinmail=2'), (1, '172.22.208.12', select email from pro.. 2023. 12. 22.
lord of sql injection 28번 - frankenstein 이번 문제도 난이도가 상당하다. 어려워서 정보를 참고했다. 우선 id가 admin인 곳의 pw를 알아내면 되는데 필터링으로 인해 오류가 나서 아무래도 error based SQLI를 써야하는것 같다. if문을 쓸수 없어서 case 문을 사용하고 오류를 발생시키기 위한 값인 9e307*2 를 넣어주어 오류를 유발하였다. 9e307*2 값은 큰 숫자값이 들어가서 오류를 일으키는 형태이다. 다른 숫자도 넣어보았는데 이 숫자만 제대로 되는것 같다. pw의 값을 검증하고 참이면 오류를 발생, 그게 아니면 0을 반환한다. 이것을 코드에 활용해서 패스워드를 알아낼 수 있다. frankenstein.py import urllib.request import requests url="https://los.rubiya.kr.. 2023. 12. 22.
lord of sql injection 27번 - blue_dragon 이번 문제는 '와 \가 필터링 되는 문제여서 우회하기가 어렵다. 대신 sleep 함수를 막지 않는것으로 보아 time based SQLI를 사용하면 될것같다. 쿼리를 사용했을때 메시지가 뜨지 않아도 sleep() 을 장시간으로 해서 주면 메시지가 뜰때 메시지대신 페이지 로딩 시간이 길어질 것이다. if문으로 length를 검증하고 sleep(3) 을 주어 참이면 3초간 sleep 후 페이지를 로딩하게 했다. length 비교값에 8을 주니 갑자기 페이지가 3초동안 로딩되었다가 불려졌다. 이를 보고 pw 길이가 8자리라는 것을 알아내었다. 이제 이를 이용해서 pw 값을 알아내면 된다. ord와 substr 함수를 이용해 알아보았다. blue-dragon.py import urllib.request impo.. 2023. 12. 22.