이번 문제의 특징이라면 지정된 패턴을 검색하는 like문과 regex문이 필터링된다.

정규 표현식 (Regexp)문은 특정한 규칙으로 문자열을 찾아내는 것입니다. 예를 들면 Y/N으로 데이터를 구분해야 할 때 소문자도 비교해야하는경우,

정규표현식으로 [yY] 조건을 통해 y 또는 Y만 구분되도록 하는 것.


항상 블라인드 인젝션을 할때마다 pw의 길이가 8이여서 대입해 보았지만 실패하고 추측할 수 없어서 코드를 짰고 pw길이는 40으로 나왔다.



파이썬 스크립트를 실행해봤을때 문자열의 첫번째 문자부터 아스키코드 범위를 벗어난 문자임을 알 수 있었다. db에는 문자형태로 저장되기때문에 정확히 한 문자가 몇바이트의 어떤 값을 가지는지 정수로 표현하여 알 수 있는 ord()를 이용해서 첫번째 문자를 분석해보기로 한다.



문자가 1바이트의 표현 영역을 벗어나진 않았다. 문자 하나당 4바이트를 사용해서 pw길이가 40으로 나오긴 했지만 실제로 문자 각각은 125~255사이에 값을 가졌다.


그렇다면 왜 substr(pw,1,1) <= 으로 가져왔을때는 4바이트 문자를 하나씩 가져오고 length(pw)<== 할때는 문자열길이를 40으로 세는가?  

각각의 함수의 작동방식의 차이라고 추측된다.


아스키코드를 벗어나고 255이하의 범위를 가진 ansi코드 차트를 이용했다. 물론 유니코드 u+00xx 차트를 이용해도 무관했다.



'Web Hacking > Lord of SQL injection' 카테고리의 다른 글

20.los iron_golem  (0) 2018.03.30
19.los dragon  (0) 2018.03.30
17.los nightmare  (0) 2018.03.29
16.los succubus  (0) 2018.03.28
15.los zombie_assassin  (0) 2018.03.27


preg_match에 /prob, _ , ., (), #, - <==를 필터링하고 pw도 6글자를 넘기면 안된다는 조건이 있다.

쿼리문에는 id!= 'admin'이 있어서 우회해야 할 듯 하다.


";%00(Null값)이용 

;는 쿼리문 두개를 같이 실행시킬 때 사용한다. ex) 쿼리문1 ; 쿼리문2

;다음에 %00(Null) 값을 준다면, 문장의 끝으로 인식하고 뒤에 문자은 확인하지 않게되고 자연스레 주석처리와 같은 효과를 내게 된다.

pw = ('')는 False

False = 0은 True로 처리된다.


'Web Hacking > Lord of SQL injection' 카테고리의 다른 글

19.los dragon  (0) 2018.03.30
18.los xavis  (0) 2018.03.29
16.los succubus  (0) 2018.03.28
15.los zombie_assassin  (0) 2018.03.27
14.los assassin  (0) 2018.03.27


succubus문제의 핵심은 preg_match의 싱글쿼터 필터링이다. 

이전 문제는 ereg의 싱글쿼터 필터링으로 %00(Null문자)를 이용해서 우회했는데 이번에는 어떤 방식으로 우회를 해야할까? 

\  <-- 문자를 싱글쿼터 앞에 써주면 싱글쿼터가 문자열로 인식되기 때문에 문자열 형태로 id에 들어가게 된다. 

후에 아래와 같이 where문을 참으로 바꿔주면 Clear! 

주의할 점은 \에 이어서 문자가들어오면 \도 문자로 인식하기 때문에 &이나 &&을 사용해야한다.



'Web Hacking > Lord of SQL injection' 카테고리의 다른 글

18.los xavis  (0) 2018.03.29
17.los nightmare  (0) 2018.03.29
15.los zombie_assassin  (0) 2018.03.27
14.los assassin  (0) 2018.03.27
13.los bugbear  (0) 2018.03.22


이전 문제에서 대소문자를 구별해서 취약했던 ereg가 이번엔 싱글쿼터를 필터링하는거 이외에는 특별한 사항은 없다.

위의 코드에서 where절이 참이 되면 무조건 $result['id']가 참이 되기때문에 이번 문제를 풀 수 있다.


제한되어 있는 싱글쿼터를 사용하는 것이 이번 문제의 핵심인데 어떻게 할 수 있을까?? 방법은 간단하다. 

%00(Null바이트)를 '앞에 붙여주면 문자열 비교를 하지 않게된다. 그렇지만 문자열수에 포함되기 때문에 변수에 들어갈땐 주의한다.


'Web Hacking > Lord of SQL injection' 카테고리의 다른 글

17.los nightmare  (0) 2018.03.29
16.los succubus  (0) 2018.03.28
14.los assassin  (0) 2018.03.27
13.los bugbear  (0) 2018.03.22
12.los darkknight  (0) 2018.03.22


get으로 받은 pw가 admin의 패스워드와 일치하면 id에서 $result와 'admin'이 같으면 조건문을 충족하게 되고 문제가 풀리게 된다.

그렇지만 패스워드가 몇글자인지 알기위해 임의의 문자를 나타내는 _을 사용하여 pw의 길이를 알아보고 sql에서의 와일드카드인 %를 문자열의 앞과 뒤 중간에 적절히 넣어서 pw를 추측해가며 문제를 풀어준다.


pw에 %(와일드카드)만 넣었을때 Hello guest라고 뜨는 걸로보아 admin이 guest보다 하위 레코드에 위치하는 것 같다. 처음부터 admin으로 떠버리면 문제가 너무 쉽게 풀리기 때문




_ (임의의 문자를 의미) <--문자를 8번 입력해 주었을때 hello guest가 떴다. 패스워드가 8자리라는 것을 알 수 있다.



admin의 패스워드를 찾기 위해 뒷자리부터 차근차근 문자를 넣어봤는데 Hello guest만 나오지 admin은 나오지 않았다. 이를 통해 admin과 guest의 패스워드가 일부 겹친다는 것을 알 수 있다. 


패스워드의 앞 두자리 8과 3역시 guest와 admin의 패스워드가 겹치는 것을  알 수 있었고..




세번째 자리에서 패스워드가 갈려 admin은 패스워드 앞 세자리가 832로 시작하고 guest는 83d로 셋째 자리에서 나뉘게 된다.





'Web Hacking > Lord of SQL injection' 카테고리의 다른 글

16.los succubus  (0) 2018.03.28
15.los zombie_assassin  (0) 2018.03.27
13.los bugbear  (0) 2018.03.22
12.los darkknight  (0) 2018.03.22
11.los golem  (0) 2018.03.22



이전문제에 비해 no에 필터로 공백, like, 0x가 추가되었다. 이것들을 적절히 우회해서 블라인드 인젝션을 성공시키기로 한다.



먼저 공백은 1. TAB :  %09 2. \n : %0a 3. \r : %0d  4.공백 : /**/ (/는 url인코딩하여 %2f)으로 우회한다. 

그다음 like는 in (" ")구문을 이용해서 대체하고 




0x나 ord(), ascii()같은 경우는 hex()로 대체해준다.


'Web Hacking > Lord of SQL injection' 카테고리의 다른 글

15.los zombie_assassin  (0) 2018.03.27
14.los assassin  (0) 2018.03.27
12.los darkknight  (0) 2018.03.22
11.los golem  (0) 2018.03.22
10.los skelleton  (0) 2018.03.22



코드에서 두번째 쿼리문을 보면 pw가 admin의 pw와 일치해야 문제가 해결되는 것을 알 수 있다.

no에서 ' , substr , ascii , = 를 필터링하고있다. 



no에 ' , = 이 금지이기 때문에 id에 admin을 헥스값으로 표현하고 pw의 문자열 길이를 대입해 봤다. 8자리라는 것을 알 수 있었다.





substr을 쓰지 못하기 때문에 mid함수를 이용해서 한자리씩 찾아간다.





pw의 범위가 숫자뿐아니라 문자까지 포함하기 때문에 mid함수의 반환값을 ord()묶어주는것이 편하다고 판단했다. python스크립트를 잘때도 편할거라고 생각함. ord는 해당 문자의 아스키값을 정수로 변환함





'Web Hacking > Lord of SQL injection' 카테고리의 다른 글

14.los assassin  (0) 2018.03.27
13.los bugbear  (0) 2018.03.22
11.los golem  (0) 2018.03.22
10.los skelleton  (0) 2018.03.22
09.los vampire  (0) 2018.03.22

 

이번문제는 블라인드 인젝션으로 조건이 조금씩 더 까다로워지고 있다.  substr()함수, =문자가 추가로 필터링 걸려있다. substr()을 대체할 수 있는 mid()함수를 이용하고 

=는 패턴이 일치하는지 비교하는 구문인 like 로 대체하면 된다. 

함수와 구문에 대한 사용법은 검색을 이용해본다.


mid함수의 인수를 적절히 돌려가며 8자리 pw를 찾아주면 된다.



자동으로 pw를 찾아주는 파이썬 스크립트는 이전 문제껄 이용해서 충분히 풀 수 있으므로 생략한다.




'Web Hacking > Lord of SQL injection' 카테고리의 다른 글

13.los bugbear  (0) 2018.03.22
12.los darkknight  (0) 2018.03.22
10.los skelleton  (0) 2018.03.22
09.los vampire  (0) 2018.03.22
08.los troll  (0) 2018.03.22



쿼리문 끝에 and 1=0때문에 뭐든 거짓으로 판별하게 되어 있다. id에 admin을 넣어주고 and 1=0을 주석처리 하면 풀릴 것이다.

%23(#)로 주석처리를 한다.


'Web Hacking > Lord of SQL injection' 카테고리의 다른 글

12.los darkknight  (0) 2018.03.22
11.los golem  (0) 2018.03.22
09.los vampire  (0) 2018.03.22
08.los troll  (0) 2018.03.22
07.los orge  (0) 2018.03.21





str_replace(찾는문자열, 치환문자열, 대상문자열)은 대상문자열안에 찾는문자열이 있다면 치환문자열로 치환하는 함수이다. 이 또한 대소문자 구분을 하기 때문에 대문자를 섞어씀으로 우회할 수 있다.




두번째 방법은 str_replace 함수의 기능을 이용하는 방법이다. admin이라는 문자사이 어디든지 admin을 끼워넣어주면 ex)"admi" + "admin" + "n" 

admin이 공백으로 치환되어 admin만 남게 되어 clear



'Web Hacking > Lord of SQL injection' 카테고리의 다른 글

11.los golem  (0) 2018.03.22
10.los skelleton  (0) 2018.03.22
08.los troll  (0) 2018.03.22
07.los orge  (0) 2018.03.21
06.los darkelf  (0) 2018.03.21

+ Recent posts