Linux/모의해킹

str_replace() 함수 사용하기

GGkeeper 2022. 1. 25. 19:52

실습> str_replace() 함수 사용하기

형식 : 
str_replace("검색할문자열", "변경할문자열", "검색할대상");

str_replace() 변경 전
<?
$str = "Hello PHP!<br>";
echo $str;
?>

http://192.168.108.101/str_replace.php
Hello PHP!


str_replace() 변경 후
<?
$str = "Hello PHP!<br>";

// str 변수에서 "Hello" 문자열을 "Hi" 로 교체해서 str 변수에 저장한다.
$str = str_replace("Hello", "Hi", $str);
echo $str;
?>

http://192.168.108.101/str_replace.php
Hi PHP!


str_replace() 변경 전
<script> 태그로 변경한다.
<?
$str = "<script>alert('XSS');</script>";
echo $str;
?>

http://192.168.108.101/str_replace.php
화면에 알림창이 출력된다.

str_replace() 변경 후
<script> 태그로 변경하면 <script>를 제거해서 자바스크립트가 실행되지 못하도록 필터링 한다.
<?
$str = "<script>alert('XSS');</script>";
$str = str_replace("<script>", "", $str);
echo $str;
?>


str_replace("<script>", "", $str); 를 우회하는 공격코드를 작성한다.
<?
$str = "<<script>script>alert('xss');</script>";
//echo $str; // Hello PHP!<br>                                                                
$contents = str_replace("<script>", "", $str);  // "<script>alert('xss');</script>";
echo $contents; // Hi PHP!<br>
?>

str_replace() 변경 후
< 문자를 &lt; 로 변경한다.
$str = "<script>alert('XSS');</script>";
$str = str_replace("<", "&lt;", $str);
echo $str;


<script>alert('XSS');</script> 메세지가 출력되지만 자바스크립트가 실행되지 않는다.
소스보기를 하면
&lt;script>alert('XSS');&lt;/script> 로 표시하기 때문에 < 문자를 태그로 인식하지 못하게 무력화 시켰기 때문이다.


read.html 부분에 이 부분을 적용시키면 자바스크립트가 실행되지 않기 때문에 XSS 가 실행이 금지된다.

-- read.html --
 :
 :(생략)
<?=$row['contents']?>
<?
// <<script>script> 로 우회가 가능하다.
// $contents = str_replace("<script>", "", $row['contents']);
// $contents = str_replace("<", "&lt;", $row['contents']);
// echo $contents;
 :
 :(생략)
-- read.html --

writeok.html 부분에 이 부분을 적용시키면 자바스크립트가 실행되지 않기 때문에 XSS 가 실행이 금지된다.
writeok.html 부분에 적용하면 read.html 에서 필터링 부분은 주석처리한다.

-- writeok.html --
 :
 :(생략)
// 필터링 부분
$contents = str_replace("<", "&lt;", $contents);
$query = "INSERT INTO $id VALUES (
          NULL, '$username',password('$passwd'),
          '$title', 
          '$contents', 
          '$origfile', 
          '$remoteip', 
          now())";


 :
 :(생략)
-- writeok.html --