개발

임시 비밀번호 생성

신림갓수 2022. 3. 16. 17:26

NFT 거래소 개발 일기

 

Metaversero NFT 거래소가 03/15일 오픈하였다.

 

 

이틀날 admin 이용자 페이지의 회원정보 수정 부분을 통해 SQL 공격이 들어왔다.

 

해당 루트 공격을 차단하였고 원상 복구 하였다.

 

이상한 문자열이 DB에 들어온 것이 없는지 공격을 확인해봐야한다. 

 

<form method="post" action="member_findpw.php" class="row form-block-sign-form">
    <div class="row">
        <div class="col-md-8">
            <label class="label">
                <span data-langNum='register_1'>Email Address</span>
                <input class="form-control" type="text" id="id-join-email" name="email"
                       placeholder="" aria-label="Email address">
            </label>
        </div>
        <div class="col-md-4">
            <button type="submit" id="id-join-send" class="btn btn-accent btn-block"
                    style="margin-top: 36px;">
                <span data-langNum='register_2'>SEND</span>
            </button>
        </div>
    </div>
</form>

 

해당 form 이 submit 되고 member_findpw.php안의 로직이 수행 된 후에 alert창이 발생하지 않았다.

 

부트 스트랩 자체의 submit과 문제가 생긴 것 같아 form에 id를 부여하고 button onclick을 사용하여 submit하였다

 

<form method="post" id="frm" action="member_findpw.php" class="row form-block-sign-form">
    <div class="row">
        <div class="col-md-8">
            <label class="label">
                <span data-langNum='register_1'>Email Address</span>
                <input class="form-control" type="text" id="id-join-email" name="email"
                       placeholder="" aria-label="Email address">
            </label>
        </div>
        <div class="col-md-4">
            <button type="button" id="id-join-send" class="btn btn-accent btn-block" onclick="document.getElementById('frm').submit();"
                    style="margin-top: 36px;">
                <span data-langNum='register_2'>SEND</span>
            </button>
        </div>
    </div>
</form>

 

임의의 문자열을 생성하여 반환해주는 method이다.

 

// 임의의 문자열 생성 ( 특수문자 포함 )
function passwordGenerator($length = 8)
{
    $counter = ceil($length / 4);
    // 0보다 작으면 안된다.
    $counter = $counter > 0 ? $counter : 1;

    $charList = array(
        array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"),
        array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"),
        array("!", "@", "#", "%", "^", "&", "*")
    );
    $password = "";
    for ($i = 0; $i < $counter; $i++) {
        $strArr = array();
        for ($j = 0; $j < count($charList); $j++) {
            $list = $charList[$j];

            $char = $list[array_rand($list)];
            $pattern = '/^[a-z]$/';
            // a-z 일 경우에는 새로운 문자를 하나 선택 후 배열에 넣는다.
            if (preg_match($pattern, $char)) array_push($strArr, strtoupper($list[array_rand($list)]));
            array_push($strArr, $char);
        }
        // 배열의 순서를 바꿔준다.
        shuffle($strArr);

        // password에 붙인다.
        for ($j = 0; $j < count($strArr); $j++) $password .= $strArr[$j];
    }
    // 길이 조정
    return substr($password, 0, $length);
}

 

해당 method를 실행 시켜 임의의 pw를 생성한 후에 md5 복호화 하여 데이터 베이스 테이블에 업데이트 시킨다.

 

$pw = passwordGenerator();
$new_pw= md5(quote_smart($pw));