php
많은 명령이 포함된 파일이 많이 있습니다 select
.
각 쿼리에 열 변수를 삽입하고 싶습니다. 즉 admin_id = '$admin_id'
, 쿼리가 .select * from users where abc='xyz' and qwe='fgh'
select * from users where admin_id = '$admin_id' and abc='xyz' and qwe='fgh'
이를 위해 다음 명령을 실행했습니다 sed -i "s/\(\"select.*\)where /\1 where admin_id = '\$admin_id' and /" *.php
.
where
위의 방법은 성공적으로 실행되었지만 쿼리에 ie가 없는 SQL 쿼리 문제에 여전히 직면하고 있습니다 select * from users
. 이러한 쿼리를 어떻게 삽입할 수 있나요 admin_id = '$admin_id'
?
PHP 파일의 쿼리는 다음과 같은 방법으로 쿼리를 함수에 전달하여 실행됩니다.
execute_query("select * from $table order by username");
grep
다음을 실행하여 수정이 필요한 쿼리를 찾을 수 있습니다.
grep 'execute_query' *| grep select| grep -v admin_id > stillleft.txt
답변1
sed 사용을 고집한다면 두 개의 s
명령을 연속으로 사용할 수 있습니다. 같은 줄에서 첫 번째 명령 다음에 두 번째 명령을 실행하지 않으려면 그 사이에 명령을 추가하면 t
이전 명령이 대체되는 경우 s
나머지 명령을 건너뜁니다 .
sed -e "s/\"select[^\";]* where /&admin_id = '\$admin_id' and /" -e t \
-e "s/\"select[^\"]*/& where admin_id = '\$admin_id' /" \
-i *.php
이것은 강력하지 않습니다. select
필드 선택이 여러 행으로 분할되는 절을 처리할 수 없으며, 예를 들어 쿼리에 하위 문자열이 포함된 where
경우 같은 행에 a가 없는 쿼리는 처리할 수 없습니다. 입력과 출력을 확인하여 문제가 발생하지 않는지 확인하십시오.group by
where
Perl을 통해 다음을 사용할 수 있습니다.탐욕스럽지 않은 반복 연산자첫 번째 예약어 또는 쿼리 끝에서 일치를 중지합니다. 이는 여전히 근사치이지만 더 강력합니다. Perl은 또한 대체 문자열을 구성하는 임의의 표현식( e
대체 뒤에 접미사 포함)을 대체할 수 있도록 허용하므로 거기에 조건을 넣을 수 있습니다.
perl -i -p -e '
s[("select.*?)(\b(?:where|group|having|order|limit|procedure|into|for|lock)\b|[;"]|$)]
[$1 . " where admin_id = '\$admin_id' " . ($2 eq "where" ? "and" : $2)]e
' *.php
PS, 이것은 포함될 수 없다는 "…'$admin_id'…"
점을 제외하면 SQL 주입이 발생하기를 기다리는 것처럼 보입니다 (그리고 잘못된 형식의 UTF-8도 문제일 수 있다고 생각합니다).$admin_id
'
답변2
admin_id = '$admin_id' and
존재하는 경우 이후 users
에만 추가하려는 경우 where
다음을 수행할 수 있습니다.
sed "s/\(select.*\)users[ ]*\(where\)\{0,1\}/\1 users where admin_id = '\$admin_id' and /" *.php
-i
예상한 결과가 나오면 플래그를 넣으세요.
그 \(where\)\{0,1\}
부분은 정규식을 흉내내기 위한 트릭입니다 ?
. 즉, 0~1번을 탐욕스럽게 반복한다는 의미입니다.