string.indexOf(searchvalue,start)


javascript에서 indexOf함수는 지정된 문자열에서 searchvalue로 특정한 문자(열)에서 start시작위치에서 부터의 위치값으로, 위치 값을 숫자로 리턴합니다.


만약 특정한 문자(열)을 찾지 못한다면 -1을 반환하게 됩니다.


start가 생략이 되면 0부터 시작하여 위치값을 얻을 수 있습니다.


예를 들면 아래와 같습니다.



위의 예시에서는 시작위치가 생략되어 0부터 시작해 "two" 문자의 시작 인덱스를 반환 한 결과로, 11이 출력됩니다.


시작위치를 지정하게 된다면 아래와 같습니다.



10이후로 탐색하도록 했기 때문에, 처음의 apple은 무시되고, 두 번째 apple의 위치값이 결과값으로 나옵니다.


배열의 경우에는 



arr[0]=apple, arr[1]=orange, arr[2]=banana, arr[3]=nut, arr[4]=graph이므로 orange의 결과값이 1로 나오게 됩니다.


lastindexOf함수는 뒤에서 부터 탐색을 하는데, 위치값은 앞에서 부터 인덱싱 한 값이 나오게 됩니다.


예를 들자면 아래와 같습니다.



뒤에서부터 탐색하기 때문에 세 번째 apple의 위치를 반환하지만, 결과값인 인덱스 값은 앞에서부터 수를 세기 때문에 28을 반환합니다.


만약 시작위치를 주어주면 아래와 같습니다.



시작위치에서부터 뒤에서 세어나가게 됩니다. 결과값은 당연히 앞에서 세어간 위치값을 받게 됩니다. 


참고:http://blog.naver.com/chsmanager/140202656859


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

페이지 이동 Loction.href  (0) 2017.11.20
base64  (0) 2017.11.06
자바스크립트 용어  (0) 2017.10.28
아스키 코드(ASCII)  (0) 2017.10.16
HTTP(HyperText Transfer Protocol)이란?  (0) 2017.04.16

error based sql injection 참과 거짓을 error로 구분하는 것인데 보통 if문으로 공격하는 기법.


일단 mysql에서의 if문을 보면

if(조건 , 참 , 거짓) 으로 나타냅니다.

이것으로 참일때 또는 거짓일 때 에러를 출력하게 하면 됩니다.

에러는 서브쿼리를 이용하면 됩니다


예시:

<?php
  
include "./config.php"
  
login_chk(); 
  
dbconnect(); 
  if(
preg_match('/prob|_|\.|\(\)/i'$_GET[pw])) exit("No Hack ~_~");
  if(
preg_match('/sleep|benchmark/i'$_GET[pw])) exit("HeHe");
  
$query "select id from prob_iron_golem where id='admin' and pw='{$_GET[pw]}'";
  
$result = @mysql_fetch_array(mysql_query($query));
  if(
mysql_error()) exit(mysql_error());
  echo 
"<hr>query : <strong>{$query}</strong><hr><br>";
  
  
$_GET[pw] = addslashes($_GET[pw]);
  
$query "select pw from prob_iron_golem where id='admin' and pw='{$_GET[pw]}'";
  
$result = @mysql_fetch_array(mysql_query($query));
  if((
$result['pw']) && ($result['pw'] == $_GET['pw'])) solve("iron_golem");
  
highlight_file(__FILE__);

?>

출처 : lord of sqlinjection


위의 예시를 보면 if문에

mysql에서 (select 1 union select 2)를 넣게 되면 Subquery returns more than 1 row 라는 에러가 뜨게 됩니다.

따라서 url에 " ' or id = 'admin' and (if(length(pw)>숫자,(select 1 union select 2),1)#"를 넣으면

숫자에 해당되는 수에서만 error를 띄우지 않습니다.

물론 select 1 union select 2 와 1 의 자리를 바꾸어 준다면 error가 참일때만 발생할 것입니다.

이렇게 알게된 길이를 범위로 잡고

비밀번호를 계속해서 대입시켜준 다음 화면을 txt로 받아 Subquery가 있을 때의 값으로 비밀번호를 찾을수 있습니다. 

-create by sang-gamja

  



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

xss (Cross Site Scripting)  (0) 2017.12.04
Drive-By-Download(DBD)공격(실습편)  (0) 2017.05.29
Blind SQL Injection (이론편)  (0) 2017.05.14
파일 다운로드 취약점  (0) 2017.05.08
CSRF (Cross-site request forgery) 란  (0) 2017.04.28

2016년 PCTF 문제인 quick 문제이다. 프로그램은 swift언어로 짜여져있고 실행환경은 64비트 리눅스 환경이다.

프로그램을 실행시키면 아래와 같이 문자열을 입력받는다.



quick 파일을 Ida를 사용해서 분석해보면 main 함수에서 'Nope!'이란 문자열을 출력하는 부분을 찾을 수 있다. 아래의 사진에서 확인할 수 있듯이 'Nope!'이란 문자열을 출력하는 부분을 보면 조건문을 통해 'Good job!'이란 문자열을 출력하는것을 확인할 수 있다.

이 사진을 보면 'if(v35&1)'이라는 조거너문을 통해 문자열을 출력한다. 결국 v35가 1이여야 'Good job!'이란 문자열이 출력된다는 얘기가 된다. 사진의 맨 윗부분에서 확인할 수 있듯이 "v35 = sub_403660(v69,v68,v67)"이란 함수를 통해 값을 가진다. 이 함수를 살피기 전에 함수의 인자로 입력되는 v69,v68,v67이란 변수를 살펴보려 메인함수의 윗부분을 찾아 올라가면 아래 사진과 같이 v72,v71,v73이란 변수이다. 

v71,v72,v73이란 변수는 &unk_6054A8이란 주소에서 값을 가져온다.


&unk_6054A8의 값은 변수 v82이고 v82는 입력받는 문자열이란 것을 아래의 사진을 보면 알 수 있다.

이제 main함수에서 필요한 정보는 모두 알아냈기에 sub_403660함수를 살펴보아야 한다. 이 함수를 살펴보면 함수가 0이나 1만을 리턴한다는 것을 알 수 있다. 이 문제를 풀기 위해서는 1을 리턴해야하기 때문에 1을 리턴하는 조건을 찾아 분석해 보았다. 함수를 보면 0을 리턴하는곳이 2곳, 1을 리턴하는곳이 한곳이 있다.  1번째 0을 리턴하는 곳은 아래의 사진 부분이다.

위의 사진을 보면 v17과 v70이 다르면 0을 리턴하는데 해당하는 2개의 변수를 찾아 올라가보면 두개의 변수가 다른 값이 나올 수 없다는것을 알 수 있다. 위의 부분은 분석을 복잡하게 만들기 위해 일부러 문제 출제자가 만들어 놓은 부분인것으로 보인다.

위의 사진은 0을 리턴하는 부분과 1을 리턴하는 부분이 같이 있다. 이 부분은 이 함수의 마지막 부분으로 이 함수 내에서 v46와 v75가 같으면 1을 리턴하면서 문제가 풀리게 된다. 이제 v46과 v75를 따라 올라가다 보면 v51과 47의 영항을 받는다는 것을 알 수 있다. v51을 따라 올라가면 코드 내에서 데이터를 저장하는데 이 값과 관련이 있음을 알 수 있다. 해당 값은 아래의 사진과 같다.

v47을 따라 올라가보면 v113과 같은 값이고 v113은 아래 사진 부분에서 v72의 영향을 받는다는것과 v72가 sub_403510함수의 영향을 받는다는것을 알 수 있다.

sub_403510함수를 보기 전 v112와 v52를 보면 v52는 sub_402ad0함수의 영향을 받고 v112는 0값부터 시작하여 반복문이 돌 때마다 v52의 값을 가진다. v73,v74를 찾아 올라가면 입력값과 관련이 있단것을 알 수 있다. 이제 sub_403510함수를 보면 아래와 같다.

이 함수를 보면 입력값을 해당 연산을 통해 값을 바꿔준다는 것을 알 수 있다.

위의 과정을 정리하면 입력받은 문자열을 위의 함수(sub_403510)을 거친 값이 코드에서 데이터를 저장하는 부분(v39=80...)과 같으면 1을 리턴하여 'Good job!'이란 문자열을 출력한다. 이를 코드로 바꿔 연산하면 아래 사진과 같이 코드를 구현할 수 있다.

위의 코드를 실행해보면 아래와 같은 플래그를 얻을 수 있다.


By curons

+ Recent posts