
[LOS] nightmare
2021. 8. 24. 19:30
Study/Web Hacking
nightmare 입장! nightmare에서는 pw파라미터만 사용하고 있다. 이번 query는 id가 admin이 아니어야 한다고 명시하고 있고, pw에 빈 문자열이 들어있다. 문제를 해결하기 위해서는 query의 결과로 id가 존재해야 하기 때문에 query를 참으로 만들기만 하면 된다. 그러기 위해 id부분을 주석처리하고, pw부분에서 1=1과 같은 payload를 삽입해서 query를 참으로 만들려고 했다. 문제는 pw 삽입 부분이 문자열이기 때문에 기존처럼 1=1 #을 사용하긴 어렵다. 여기서 MySQL의 auto type cast를 이용하면 참 쿼리를 만들 수 있다. 문자열과 숫자를 비교하게 되면 문자열을 0으로 변환하여 비교하는 특성이 있기 때문에 pw를 ('')=0 형식으로 변환했다. 그런..

[LOS] zombie assassin
2021. 8. 19. 15:28
Study/Web Hacking
zombie assassin 입장! 이번 단계는 id와 pw 모두 query에 포함된다. 특별히 달라진 점은 addslashes()를 적용시킨 후에 strrev() 함수가 추가된 것이다. strrev함수는 인자를 거꾸로 반대로 반환하는 함수이므로 입력한 payload가 반대로 적용된다. zombie assassin을 clear하려면 result['id']가 존재해야 하므로 query를 참으로 만들기만 하면 된다. 이전 단계처럼 \문자를 사용해서 id의 '를 일반 문자로 변환하고 pw의 '까지 id의 값으로 인식시키는 방법을 사용해봤다. 그러기 위해서 \를 id에 넣으려고 했지만 addslashes() 때문에 \가 \\로 escape되면서 id값의 인식 범위를 변경하지 못했다. addslashes()를 활..

[LOS] succubus
2021. 8. 9. 21:42
Study/Web Hacking
succubus 입장! succubus 화면이다. id와 pw를 query에 삽입하고 있고 prob, _, ., (, ), '를 필터링하고 있다. 이번 문제에서도 '를 이용해서 앞을 막고 뒤에 새로운 쿼리를 작성할 수 없다. 대신에 \문자를 사용해서 query에 이미 작성된 '를 일반 문자 취급할 수 있다. id에 \를 대입한다면 id='\' and pw =''이 되면서 안쪽 내용이 문자열로 취급된다. 이후에 pw에 or 1=1#를 삽입한다면 참 쿼리로 바뀌면서 id를 얻어올 수 있게 된다. 최종적으로 아래와 같이 파라미터를 작성할 수 있다. ?id=\&pw= or 1=1# succubus 해결!

[LOS] assassin
2021. 8. 2. 14:35
Study/Web Hacking
assassin 입장! 이번 문제는 pw 하나만 입력받고 있다. 그리고 필터링도 싱글쿼터 하나다. 싱글쿼터가 필터링되고 있기 때문에 앞의 query를 '로 막고 새로운 query를 작성하는 방법은 사용할 수 없다. 즉 주어진 like문을 활용해서 해결해야 한다. admin의 password를 알아내야 admin id를 select할 수 있는데 like를 적절히 활용하면 모든 password를 알아낼 필요는 없다. ex) like '김%' → 김으로 시작하는 문자열 like '%김%' → 중간에 김이 있는 문자열 like '%김' → 김으로 끝나는 문자열 위 특성을 이용해 password의 앞머리 문자만 알아내면 admin id를 select할 수 있다. - password length 더보기 import..

[LOS] giant
2021. 7. 26. 17:21
Study/Web Hacking
giant 입장! 이번 문제는 id와 pw를 통해 해결하는 문제가 아닌 것 같다. 아래쪽의 if문을 보면 $result[1234]의 값이 존재해야 문제를 해결할 수 있는 것으로 보인다. 현재 query를 보면 where절이 항상 참이기 때문에 1234 column의 값을 가져올 수 있다. 다만, from과 뒤에 prob가 공백 없이 붙어있기 때문에 제대로 동작하지 않는다. 따라서 from뒤에 공백을 추가해서 query를 정상적으로 동작시켜야 한다. 이제 필터링 부분을 살펴보자. from뒤에 공백을 넣을 때 $_GET[shit]을 이용하면 될 것 같다. 현재 $_GET[shit]은 문자열의 길이가 1보다 크면 필터링되고, 공백문자와 \n, \r, \t모두 필터링되고 있다. 공백문자 우회를 위한 문자는 대부..

[LOS] bugbear
2021. 7. 20. 17:03
Study/Web Hacking
bugbear 입장! bugbear도 똑같이 admin의 password를 알아내야 하는 문제다. 이번 문제는 no에서 싱글쿼터와 함수명 뿐만 아니라 or, and, 공백, like까지 필터링하고 있다. or와 and는 ||와 &&를 대체로 쓰면되고, 공백은 %0a를 사용하여 우회할 수 있다. like같은 경우 등호 문자를 대체하여 쓴 것이었기 때문에 등호 문자 필터링을 우회할 수 있는 다른 방법을 사용하면 된다. 등호문자 필터링 우회 방법은 아래와 같다. ① LIKE 연산자 - id like "admin" ② IN 연산자 - id in ("admin") ③ instr(string $str, string $substr) - instr(id, "admin") ④ 부등호 () - length(pw)..

[LOS] darkknight
2021. 7. 17. 14:21
Study/Web Hacking
darkknight 입장! 위 사진은 darkknight 시작화면이다. 아래 php 소스코드에서 해당 문제를 해결하기 위한 조건을 찾아봤다. query로 얻어온 pw와 입력한 pw가 같아야 문제를 해결할 수 있다. 그런데 query를 잘 보면 id='admin'과 pw가 and로 묶여있는 것을 알 수 있다. 즉 query에서 얻어온 pw는 admin의 pw다. GET방법으로 전달하는 pw가 admin의 pw와 같아야 하므로 우리는 admin의 pw를 알아내야 한다. 먼저 pw의 길이를 알아내야 한다. 아래 소스코드를 실행하면 pw의 길이를 구할 수 있다. (no에서 싱글쿼터와 =을 필터링하고 있기 때문에 대체로 더블쿼터와 like를 사용) import requests url = "https://los.r..

[LOS] golem
2021. 7. 11. 08:08
Study/Web Hacking
golem 입장! 이번 문제를 해결하기 위해서는 admin의 pw를 알아내야 한다. 소스코드에 주어진 query는 id만을 가져오게 되어있다. 대신 Hello admin이라는 문자열을 통해 쿼리의 참 거짓을 알아낼 수 있다. 즉 Blind SQL Injection으로 해결할 수 있다. 먼저 password의 길이를 알아내야 한다. password의 길이는 8이다. 이제 admin의 pw를 알아내기 위한 자동화 프로그램이 필요하다. 자동화 프로그램 소스코드는 아래와 같다. import requests url = "https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.php" cookies={'PHPSESSID':'tt2tomujp7112o1..

[LOS] skeleton
2021. 6. 27. 21:13
Study/Web Hacking
skeleton 입장! 이번 문제는 뒤에 주석처리만 잘해주면 되는 문제다. query 마지막에 and 1=0 때문에 해당 쿼리는 항상 거짓이 된다. 따라서 pw 마지막에 주석을 달아서 and 1=0 부분을 무효화 해야 한다. payload는 다음과 같이 작성할 수 있다. ?pw=' or id='admin'# → ?pw=%27%20or%20id=%27admin%27%23 skeleton 해결!