일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 활성화함수파이썬
- 딥러닝파이썬
- 스트림암호
- 인공지능
- 버퍼오버플로우
- 파이썬
- BOJ
- 항등함수
- FTZlevel10
- 파이썬신경망
- 알고리즘
- 신경망
- 신경망 학습
- 달고나bof
- 밑바닥부터시작하는딥러닝
- C언어알고리즘
- 8086CPU레지스터
- 신경망파이썬
- 소프트맥스함수
- 보안
- 백준알고리즘
- 머신러닝
- 딥러닝
- c언어
- C알고리즘
- BOF
- 신경망구현
- C언어 알고리즘
- 백준
- 정보보안
- Today
- Total
목록<CTF>/<Lord of SQLInjection> (6)
HeeJ's
문제의 소스코드를 한 번 살펴보려고 한다. if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); if(preg_match('/or|and/i', $_GET[pw])) exit("HeHe"); 이 부분을 보면 or와 and가 필터링되고 있다. 이런 경우, 연산자를 사용해주면 된다. or를 대신해 || , and를 대신해 && 를 사용해주면 된다. $query = "select id from prob_darkelf where id='guest' and pw='{$_GET[pw]}'"; 입력받는 쿼리문의 형태이다. pw를 get 방식으로 받아주는걸 알 수 있다. 그냥 간단하게 풀던 방법에서 or 대신에 ||를 사용해주면 될 것이다. 이렇게 제..
필터링 되는 preg_match 구문을 보면, 이 문제에서는 '공백'이 필터링된다는 것을 알 수 있다. or나 and를 사용할 때는 앞 뒤에 공백이 꼭 들어가야하므로, 이와 관련된 문제라고 볼 수 있다. 하지만 이 or와 and는 연산자로 대신할 수 있다. or -> || and -> && 이 쿼리 문에서 or를 대신해 ||를 사용해준다면 공백이 없이도 이 문제를 해결할 수 있다. 이렇게 쿼리문을 전송해 준다면 문제를 해결할 수 있다.
이 orc 문제는 blindSQL 문제로, 전송한 쿼리의 리턴 값이 true인지 false인지의 반응을 통해 pw의 값을 알아보는 문제이다 이 문제를 풀기 위해 자동화 스크립트를 파이썬으로 작성해주었다. import requests #los orc url = "Lord of SQL orc URL" headers = {"Cookie":"PHPSESSID=Your PHPSESSID"} #패스워드 길이 구하기 for i in range(50): query="pw='||id='admin' and length(pw)={}%23".format(i) r = requests.get(url+query, headers=headers) if "Hello admin" in r.text: length = i break #패스워..
필터링되는 문자열을 보면 싱글쿼터, 더블쿼터가 필터링된다는 것을 알 수 있다. 그렇다면 문자열을 인코딩해서 넣어주어야 할 것 같다. 입력되는 쿼리문이다. GET방식으로 입력해줘야할 값은 no이다. id가 admin일 때 goblin 문제를 solve할 수 있게 된다. 하지만 쿼리문을 보면 이미 id가 guest로 이미 들어가있다. 그렇다면 id='guest' and no={$_GET[no]} 구문을 false로 만들어주고, and를 이용해 뒤에 id=admin을 넣어주어 문제를 해결할 수 있을 것이다. 그렇다면 GET방식으로 ?no=0 and id='admin' 을 넣어주면 해결할 수 있을것이다. 하지만 싱글쿼터가 필터링 되는 것을 위해서 확인해주었기 때문에 'admin'을 char()함수로 싱글쿼터를 ..
소스코드를 우선 살펴보았다. 필터링 되는 내용 확인 전송되는 쿼리문의 형태 확인 문제 해결 방법 확인 id가 admin이어야 이 문제가 solve되며, get으로 입력받는다. 굉장히 간단한 문제인 것 같다. get 방식으로 id 값에 admin을 넣어주고 뒷 부분을 주석처리하면 된다. 이 문제 또한 #가 인코딩되지 않기 때문에 직접 값을 %23으로 바꿔주면 문제를 해결할 수 있다.
코드를 살펴보면 get 방식으로 입력받은 id나 pw 값에서 preg_match를 이용해 위의 문자열들을 검색해, 그 문자열들이 포함된다면 exit()를 실행하게 된다. ==> 필터링 된다. 필터링되는 문자열들을 확인해주었고, 전달되는 쿼리문의 형식은 이렇다. id로 입력 받은 값을 or를 이용해 true로 만들어주고, 뒤의 pw 부분을 주석처리 해주면 문제를 해결해 줄 수 있을 것이다. get방식으로 ?id=' or 1=1# 을 넣어주어 id의 싱글 쿼터를 닫아주고, or문 뒤에 true인 문장을 붙이고, #를 통해 뒤에 주석처리를 해 주었다. 엔터를 입력한 후 url을 보니 #가 전달될 때 인코딩되지 않은 것을 확인할 수 있었다. 그래서 값을 직접 바꿔주었다.