webhacking/sql, sql injection 98

wargame.kr DB is really GOOD

뭔지 몰라서 한참찾았다. 이것저것 별 난리를 다해봐도 넘어가는데 이상이 없다. 문제 클릭을 해보면 유저와 db사이에 관계? 를 파악하는 문제라는데 답이 없어보인다. 첫번째날은 그냥 포기해버리고 다음날에는 admin으로 접속하면 안된다고 자바스크립트로 표시된 부분에 주의하여, admin계정으로 접속하면 뭔가 있을것같아서 접속했다. 어 근데 자바스크립트로 되있어서 아무값이나 입력 후 프록시로 잡아채서 admin으로 바꿨는데 안된다. 클라이언트측에서도 검사하고 서버측에서도 검사하나보다. 서버측에서 검사할땐 일반적인 php....같은걸로 할테니까 예전에 어디서 보았던 php의 널바이트 였나? ;%00 으로 잘 조합하면 될것같기도 했다. user_id=adm;%00in 로 바꿔서 보내봤더니 이런 소스가 뜬다.? ..

information_schema

information_schema 데이터베이스에는 모든 테이블의 정보가 들어있음. 데이터베이스.테이블이름 이런 형식으로 접근 가능함. 많이 쓰이는건 information_schema.tables, information_schema.columns, information_schema.processlist 테이블명을 알아낼때. information_schema.table 테이블의 table_name컬럼이 있음. 이 컬럼은 영어 그대로 테이블 이름을 저장해둠. select table_name from information_schema.tables; 로 해보면 시스템 테이블이라던지 모든 테이블이 보여져서 찾기가 불편함. 현재 내가 들어온 db의 테이블만 보려면 select table_name from inform..

wargame.kr lonely_guys

http://wargame.kr:8080/lonely_guys/index.php 방법론은 대충 알았는데 잠시 해멨다. reg_single(sort) 부분을 클릭하면 정렬이 됬다가 다시 반대로 정렬이 됬다가 바뀐다. 소스 윗부분에는 POST방식으로 sort를 받는다. 그리고 이것에 따라서 정렬을 수행하는것 같다. if(isset($_POST['sort'])){ $sort=$_POST['sort']; }else{ $sort="asc"; } 그리고 mysql_real_escape_string함수로 받은 sort에서 위험한 문자를 제거한 후에 쿼리를 돌린다. $result=mysql_query("select * from guys_tbl order by reg_date $sort"); 대충 여기까지 읽어봤으면 P..

rubiya.kr 19번 다른방법.(원래방법?)

if등의 조건문이 전부 막혔을시 이전 글에서 coalesce라는 이상한 함수를 써서 해결했었는데 페이스북 그룹 생활해킹에서 또다른 해답이 올라왔는데 너무 좋은 방법같아서 포스팅... Izayoi Sakuya님의 방법인데.. 이런식으로도 할수 있다고 함.. 우와 신기... 더 아래 댓글에서 union은 내부적으로 임시 테이블을 만들고 쿼리문의 결과를 테이블화 한 후에 리턴하므로 저런 에러가 발생하는것 같다고 추측하셨음.. 어제 적었던 a' or coalesce(substr~ or null, (에러나는서브쿼리)); 나 이 글의 a' or (select 0x~ union select substr~); 를 조합하면 엄청나게 많은 벡터가 생성될듯. 다만 위 구문은 or이 안막혀있어야 하고, 아래구문은 select..

mysql hex()함수에 관해서

블라인드 인젝션시 한글자씩 값을 뽑아와야되는데 ascii나 ord가 막혀서 hex로 값을 뽑아오는 경우가 있다고 가정하자. 일단 프로그래밍으로 자동화하기에 앞서 mysql에서 구문이 제대로 동작하는지 확인해봐야 될 것이다. mysql> select * from prob;+-------+-------+| id | pw |+-------+-------+| admin | 1234 || guest | guest || oop | nop |+-------+-------+3 rows in set (0.00 sec) mysql> 요런 테이블이 있다고 가정하면 연습으로 pw에서 제일 첫번째 글자를 뽑아와서 그것을 hex했을시 아스키코드값인 0x67(10진수 103) 이 나오는걸 확인할수 있다. 그런데 단순히 이거만 확인..

webhacking.kr 13번.

힌트는 HINT : select flag from prob13password 라는 쿼리문하나. 다른곳을 찾아봐도 다른 힌트는 없고, SQLI같이 소스가 보이지도 않아서 블라인드 인젝션으로 생각. 나와있는 열은 flag밖에 없어서 flag값을 알아내는거라고 추측 값을 넣을 수 있는 no에 이것저것 값을 넣어보면 0또는 1만 나오고, 1 이외의 다른 수를 넣어봤을때 무조건 0이 나오는걸로 보아서 0을 틀린경우로, 1을 맞는경우로 사용하면 되겠다고 생각. 값을 넘길때 no=?식으로 값이 넘어가는데 쿼리문을 예상해보자면 select flag from prob13password where no=?같은 형식이나 select 열 from 다른테이블 where no=? 같은 형식으로 예상할 수 있음. no=if((se..

mysql max,min함수

mysql에서 max,min함수를 자주 쓴다. 그런데 종종 헷갈릴 때가 있다. 컬럼에 'aaa'와 'bcd'와 같이 길이가 같은 두개의 열이 있다고 하면.. max결과시 뭔가 예상했듯이 'bcd'가 결과로 나온다. 하지만... 'c' 'bcd' 두개의 열이 있고, max함수를 써보면 c가 결과값으로 나온다. 개발 경험이 없고 웹해킹에서만 쓰다 보니 그냥 길이가 긴게 우선인줄 알았는데 아니다. 길이가 같던 다르던, 앞에서부터 하나하나 비교하다가 더 뒤쪽의 아스키코드값이 나올경우 그게 max값이다. 'bc'와 'bcd'가 있으면 bcd가 max이고, 'bd'와 'bcz'가 있으면 bd가 max이다. (길이는 상관없다.) mysql> select * from contacts;+------+-------+---..

webhacking.kr 9번.

처음에 문제 들어가기 위한 관련 자료 -> 여기 a = ['{:x}'.format(i) for i in range(128+1)] 관련 자료는 여기 일단 요청을 보낼때 파로스나 버프같은 프록시로 요청을 잡아서 메소드를 OPTION메소드로 바꿔서 요청을 보내면 어떤 화면이 나오는데.. 인젝션은 특별히 어려운게 없으므로 그냥 하면 됨. 필터링을 다 피하고 쿼리문을 짜보면 if(substr(비밀번호,1,1)in(0x16진수),3,0) 이런식으로 판별. 그런데 한가지 이상한점. 처음에 인젝션할때는 맞으면 no=1로 판별해서 Apple가 출력되면 맞는걸로 확인, 틀리면 no=2로 판별 해서 banana였나? 그게 나오도록 해서 판별했는데 이런식으로 판별하니 중간에 맞는 값인데도 인젝션 결과가 틀리게 나와서 한참동안..

itchy

http://itchy.dothome.co.kr/ 예상 쿼리문 : select id from table where id='$_GET[id]' and pw='$_GET[pw]' 1. admin으로 로그인하면 통과. id=guest,pw=guest입력시 guest로 로그인 가능.필터링된게 없는거 같으므로admin'#&pw=guest 등으로 pw를 막아버리면 됨.만들어질 예상 쿼리문 : select id from table where id='admin'#' and pw='guest'?id=admin'%23&pw=guest %23은 #으로 mysql 주석. 2. id에 #과 --필터링 추가.id=a&pw=g' or id='admin 으로 id, pw다틀려도 마지막 id='admin으로 true를 만드면 됨.만들..

시간 기반 sql 인젝션.

참고 : http://www.sqlinjection.net/ 시간 기반 인젝션은 간단히 설명하자면 쿼리의 결과값이 true이던 false이던간에 그 결과값을화면에 출력하지 않아서 알아볼 수 없을 시에, 시간을 멈춤으로서 경과한 시간을 가지고쿼리의 참 거짓을 판별하는걸 말합니다.테이블을 간단하게 하나 만들었습니다. 1. 위 설명 그대로 시간을 멈춤. mysql의 sleep함수를 이용합니다. password에서 첫 글자를 뽑아왔을시 h가 맞으면 2초를 멈추겠다는 쿼리입니다. 아래 결과를 보면 첫글자가 h가 맞을시 2초의시간이 걸렸고, 틀렸을시에는 그냥 결과를 출력하는걸 알 수 있습니다. 코딩을 할 때에는 시간 모듈같은걸 써서 해당 시간이상걸렸으면 true라고 판별하면 되겠죠? 2. sleep함수가 필터링되서..