preg_match함수에서 and나 or을 쓰는것을 막고 있다.

쿼리를 보면 id랑 패스워드에 해당하는 것을 가져온다.

이문제를 해결하려면 데이터베이스에 admin이라는 아이디를 가져와야지 풀리는 문제임을 알 수 있다.

 

일단 or랑 and가 필터링 되어 있으니까 or 대신 ||을 쓰고 and 대신 &&모양을 사용하면 된다.

여기서 and문자는 url에서 처리되기 때문에 url인코딩을 해서 %식으로 입력을 해줘야 된다.

 

where문을 거짓 처리하고 admin을 새로 적어주려고 pw에 0이나 빈칸 등의 값을 넣어주면 where문이 거짓 처리가 된다.

그리고 admin이 나오도록 쿼리를 바꿔주는데

select id from prob darkelf where id='guest' and pw='0' or id ='admin'하면 해결할 수 있다.

이때 or와 and는 우회해서 적어주면 해결할 수 있다.

 

마지막에 #을 붙이는데 #도 url인코딩해서 사용한다. 이유는 pw검증을 무시하는 공격 방법으로 pw검증부분을 주석처리 해서 보내는 방법으로 문제를 해결할 수 있다.

 

?pw=0'||id='admin'%23

preg_match함수에서 공백이 있으면 No Hack 을 출력하게 되어있다.

이문제 역시 id 가 admin이면 wolfman을 출력하며 성공메세지를 얻을 수 있다.

 

공백을 사용할 수 없으니 공백을 대체해서 문제를 해결할 수 있다.

id가 guest로 이부분을 거짓처리하고 id에 새로 admin을 삽입하면 될것 같다.

 

공백 필터링을 우회할 수 있는 것들을 찾아보니 여러가지가 있었다.

https://wave1994.tistory.com/8

pw='or%09id='admin'%23

해결

일단 공백을 입력하면 정답이 나오지 않는 다는것 공백을 우회하는 방법은 익혔으나 ?뒤에 어떤식으로 써야되는지는 더 공부해봐야 될듯 싶다..!

 

SQL injection공백 우회방법이 적힌 것들이다

https://binaryu.tistory.com/31

id는 admin으로 고정 pw를 맞추면 해결할 수 있다.

 

블라이드 인젝션 문제로 substr함수가 많이 사용된다.

 

substr(문자열, 시작위차, 길이) 문자열의 시작위치에서 잘라낼 문자개수를 지정하여 반환한다.

예를 들어 substr(pw,1,1) 문자열 첫번째 부터 1개 문자열 가져오기

 

찾아본 바로는 이 문제를 풀기 위해서는 ascii 함수와 length함수가 필요하다.

 

여기서 ascii함수가 필요한 이유는 ><연산을 사용하기위해서다.

length함수가 필요한 이유는 문자열의 길이를 알기 위해서 이다.

 

여러 숫자들을 넣어보고 비번의 길이가 8이라는 것을 알아낼수 있다. 

맞지 않은면 Hello admin이 출력되지 않고 비번 길이를 맞추니까 Hello admin이 나왔다.

 

비밀번호를 알아내기위해서는 파이썬으로 프로그램을 짜서 알아내야 하는 것 같다....

 

파이썬으로 직접 코드를 짜는 것은 차차..하고.. 일단 참고한 답을 입력하면 성공할 수 있다.

 

 

참고

https://itsaessak.tistory.com/197

 

Lord Of SQL injection [ 4.Orc ]

GET방식으로 pw를 입력받는다 add|ashes() 함수를 통해서 비밀번호를 변환하고 그 비밀번호에 일치하는 비밀번호를 테이블에서 찾아낸다 처음 입력한 패스워드와 테이블의 패스워드를 비교하여 일

itsaessak.tistory.com

 

https://tech-dailylife.tistory.com/entry/Lord-of-SQL-Injection-orc-4%EB%B2%88-%ED%92%80%EC%9D%B4

id는 guest로 정해져 있고 id가 admin이면 문제가 풀린다.

get방식으로 정의 할수 있는 부분은 no부분인걸 확인할 수 있다.

 

preg_match부분을 보면 ' " 등은 우회해서 사용해야하는걸 알 수 있다.

 

no부분만 정의 할 수 있으니 아예 no 부분을 거짓 처리하고 id=admin을 넣으면 문제가 풀릴 것 같다.

 

no=0 and id = %27admin%27로 따옴표를 url인코딩한 겂으로 넣어주었는데.. 실패

 

찾아보니까 두가지 경우로 문제를 해결할 수 있었다.

 

1) 첫번째는 admin값을 hex값으로 인코딩 하면 해결할 수 있다.

no=0 or id=0x61646d696e

 

 

2) 두번째는 no=0 || no=2 무차별 대입 공격이라는 것이 있었다.

 

 

참고

https://leeeeye321.tistory.com/171

 

[Lord Of Sql injection] goblin

[Lord Of Sql injection] goblin $query = "select id from prob_goblin where id='guest' and no={$_GET[no]}"; where 절을 보면 id는 guest로 정해져 있다. if($result['id'] == 'admin') solve(..

leeeeye321.tistory.com

https://tech-dailylife.tistory.com/entry/Lord-of-SQL-Injection-goblin-3%EB%B2%88-%ED%92%80%EC%9D%B4

+ Recent posts