if가 막혔다. select union으로 이를 우회하겠다 . 이제 에러메세지가 뜨질 않기 때문에 이를 생각하고 자동화를 해야한다. union select를 통해 이전 쿼리의 결과와 값을 합쳐서 나타낼 수 있다. 다만 컬럼의 수가 동일해야한다! 먼저 비밀번호의 길이를 구하였다. 이 원리는 서브쿼리는 레코드가 무조건 한개여야한다는 원리로, length(pw)=8일시에는 1이 반환되고 아닐 시에는 0,1 이 반환되어 에러가 뜨는 것이다. 일단 비밀번호의 길이는 8자라는 것을 알았다! 또한 비밀번호가 ascii로 인코딩 되있다는 것도 알아냈다. 이제 자동화를 돌려줄 수 있을 것 같다. (select 1 union select substr(pw,1,1)=?) 으로 구해줄 수 있을 것이다. 만약 참이라면 결과값에..
전공쪽/Lord of Sql injection
이제부터 푸는 방법이 바뀌었다. 오류기반 sql injection 기법들을 적극 활용하겠다. 가장 중요하게 쓴 것은 if(조건, ture, false) 였다. 먼저 if(length(pw)=32, pow(2,9999),1) 을 통해 pw의 길이가 32바이트라는 것을 알았다. 그리고 ascii 인코딩임을 확인하였다. 이제 substr로 단순한 brute forcing을 진행하였다. 코드는 다음과 같다 #!/usr/bin/python #-*-coding:utf-8 -*- import urllib,urllib2,requests header={"Cookie":"PHPSESSID=****"} password='' a='' for i in range(1,33) : admin=0 guest=0 b=[0,0,0,0] ..
상당히 어려웠던 문제이다... 솔직하게 인터넷 찾아보고 싶었다. 그런데 쉬운문제들은 봐도 상관없는데 어려운 문제는 안보고 푸는 재미가 있기때문에 좀 삽질을 많이 해보았고 혼자 풀어서 뿌듯했다 일단 bruteforce관련 문제이다. 그리고 regex와 like가 안되는데, regex는 정규표현식. 일단 pw 길이는 8일것이다. 귀신같이 아니였다 ㅋㅋㅋㅋ 물론 password 길이를 자동화 돌려도 되지만, 약간의 주의가 필요할 듯 보여서 (그리고 사실 부등호를 이용하면 이진탐색이 가능하고 이건 손으로 하는게 더 빠를 것 같아서. ) order by로 admin이 최상단에 위치하게 해주겠다. 비번은 12바이트이다. 사실 order by 쓸 필요가 없었던듯.. 이제 자동화를 돌려주면 된다. addslashes우..
갑자기 괄호가 들어간 것과 filter식에서 괄호가 없는 것을 봐서는 괄호를 쓰라는 것 같다. 근데 #도 필터링이라서 우회코드인 %00을 써주도록 하겠다. 그리고 페이로드가 6글자까지로 제한되서 sql cheat sheet를 참고해 or 1=1 대신 =0#을 사용해주었다. 이 원리는 ''이 빈공간이라 0으로 인식이 되서 그렇다고 한다. 부등호도 된다.