了解sql注入、xss攻击及解决

VSole2021-10-28 07:42:32

前言

    朋友说:听说你做了个网站

    我说:对啊,赶紧成为我的用户啦

    朋友说:好啊,你知道sql注入、xss攻击吗

    我说:不知道

    朋友明天跟我说,哇,管理员账户就是好,有好多权限,真香

    我说:你怎么能登录我管理员账户???

    朋友说:你都不知道sql注入、xss攻击,那你肯定没做这些,我利用sql注入,知道管理员账户就可以登录进去啦

    吓得我赶紧去做一下相关工作,还好朋友告知

    下面详细了解sql注入、xss攻击及解决

四个方面

1. 什么是sql注入

    所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。是最原始、最简单的攻击,从有了web2.0就有了sql注入攻击。

2. sql注入例子

    用户登录,我们需要去查询用户表(users),对比用户名(username)和密码(password)

   SQL语句:

// 正常select * from users WHERE username="zhangsan" and password="524abb53cce35"
// sql注入 用户名写入:zhangsan'-- select * from users WHERE username='zhangsan'-- ' and password='5245'

    上面两条sql语句都能查询到用户的存在,并且第二条语句中密码校验的语句已经被注销了,那么这个时候如果别人知道你的用户名就能登录你的账号,这样子岂不是很危险??????

    我们来看下执行的sql语句,果然是 -- 后面被注释了~~~

select id, username, realname from users where username='zhangsan '-- ' and password='696'

    不必慌,我们来看一下之前的db/mysql.js文件,

const mysql = require('mysql')const { MYSQL_CONF } = require('../conf/db')
// 创建链接对象const con = mysql.createConnection(MYSQL_CONF)
// 开始链接con.connect()
// 统一执行 sql 的函数function exec(sql) {    const promise = new Promise((resolve, reject) => {        con.query(sql, (err, result) => {            if (err) {                reject(err)                return            }            resolve(result)        })    })    return promise}
module.exports = {    exec,    escape: mysql.escape // 防止sql注入 编码特殊字符}

    看到这段关键代码了吗???

    escape: mysql.escape // 防止sql注入 编码特殊字符

    我们来改动一下之前的controller/users.js login方法:

const { exec, escape } = require('../db/mysql')const { genPassword } = require('../utils/cryp')
const register = async (username, password) => {    ...}const userNameFilter = async (username) => {    ...}
const login = async (username, password) => {    username = escape(username) // 格式化 预防sql注入    password = genPassword(password) // 生成加密密码    password = escape(password) // 格式化 预防sql注入
    const sql = `        select id, username, realname from users where username=${username} and password=${password}    `    // console.log('sql is', sql)
    const rows = await exec(sql)    return rows[0] || ''}
const userInfo = async (id) => {    ...}
module.exports = {    login,    register,    userNameFilter,    userInfo}

    我们再来登录一下,发现登录果然失败了

    格式化之后执行的sql语句:

select id, username, realname from users where username='zhangsan \'-- ' and password='6996'

    从上面对比我们可以知道,escape 就是对一下能对sql语句有影响的特殊字符进行格式化,预防拼接sql语句。

    所以为了预防万一,我们需要把能拼接成sql语句的变量都要加上escape!

3. 什么是xss攻击

   XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。

  • 攻击方式:

    盗用cookie,获取敏感信息。

    利用植入Flash,通过crossdomain权限设置进一步获取更高权限;或者利用Java等得到类似的操作。

    利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻击)用户的身份执行一些管理动作,或执行一些一般的如发微博、加好友、发私信等操作。

    利用可被攻击的域受到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不当的投票活动。

    在访问量极大的一些页面上的XSS可以攻击一些小型网站,实现DDoS攻击的效果。

4. nodejs怎么来防范XSS攻击:

    首页我们安装一个xss依赖

npm install xss --save-dev
  • 下来我们来举一个简单的例子吧!看注释!!
const xss = require('xss') // 引入xssconst { exec } = require('../db/mysql')
const newBlog = async (blogData = {}) => {    // blogData 是一个博客对象,包含 title content author 属性    const title = xss(blogData.title) // 防范xss攻击    const content = xss(blogData.content) // 防范xss攻击    const author = blogData.author    const createTime = Date.now()
    const sql = `        insert into blogs (title, content, createtime, author)        values ('${title}', '${content}', ${createTime}, '${author}');    `
    const insertData = await exec(sql)    return {        id: insertData.insertId    }}
module.exports = {    getList,    getDetail,    newBlog}

    简明扼要的说一下:防范xss攻击的方式就是把特殊字符编码

    什么是特殊字符呢?

    用户输入的数据进行HTML Entity编码, 也就是对<script><a>等标签的< >进行转换,然后再保存到后台数据库。

    例如:

    在 input 输入框 恶意输入 <script> document.cookie </script>, 就会被转换为下面的语句并存入数据库:

    &lt;script&gt; document.cookie &lt;/script&gt;,已达到无法执行 <script> 的目的!!!!

最后

sql注入:窃取数据库内容

XSS攻击:窃取前端的cookie等敏感信息

密码加密:保障用户信息安全(重要)

DDOS攻击:需要硬件和服务来支持(需要OP支持)

原文地址juejin.cn/post/684490…https://juejin.cn/post/6844904179085869063
xsssql注入
本作品采用《CC 协议》,转载必须注明作者和本文链接
CTF-web--命令注入
2023-03-31 09:51:35
大佬总结的文章,本篇文章阅读时间大约30分钟。一 、基本原理 命令注入指的是,利用没有验证过的恶意命令或代码,对网站或服务器进行渗透攻击。注入有很多种,并不仅仅只有SQL注入。Injection)客户端脚本攻击(Script?injection)动态函数注入攻击(Dynamic?Evaluation)序列化注入&对象注入。这种题目又哪些常见的,一个是我们常用的文件包含,我们是可以使用system等函数的,或者是php函数,应该也属于命令注入的范畴。类似于 ?
一款功能强大的Web应用程序安全扫描工具
网上安全渗透测试工具整理全集,部分链接可能失效,但可以搜索到
服务器的相关信息(真实ip,系统类型,版本,开放端口,WAF等) 网站指纹识别(包括,cms,cdn,证书等),dns记录 whois信息,姓名,备案,邮箱,电话反查(邮箱丢社工库,社工准备等) 子域名收集,旁站,C段等 google hacking针对化搜索,pdf文件,中间件版本,弱口令扫描等 扫描网站目录结构,爆后台,网站banner,测试文件,备份等敏感文件泄漏等 传输协议,通用漏洞,ex
Web Hacking 101 中文版:https://wizardforcel.gitbooks.io/web-hacking-101/content/ 浅入浅出Android安全 中文版:https://wizardforcel.gitbooks.io/asani/content/ Android 渗透测试学习手册 中文
这里建议doc文档,图片可以贴的详细一些。爆破完好了,一样的6。想给它一个清晰完整的定义其实是非常困难的。
一、漏洞挖掘的前期–信息收集 虽然是前期,但是却是我认为最重要的一部分; 很多人挖洞的时候说不知道如何入手,其实挖洞就是信息收集+常规owasp top 10+逻辑漏洞(重要的可能就是思路猥琐一点),这些漏洞的测试方法本身不是特别复杂,一般混迹在安全圈子的人都能复现漏洞。接下来我就着重说一下我在信息收集方面的心得。
涉及系统命令调用和执行的函数在接收用户的参数输入时未做检查过滤,或者攻击者可以通过编码及其他替换手段绕过安全限制注入命令串,导致执行攻击指定的命令。
如果手工测试无果后再用代理手法扫描网站,必要的时候设置二级代理。什么站能扫什么站不能扫,心里一定要有点 b 数!浅蓝的渗透测试导图以及小工具这里有一个更加详细的导图,可以做一个大致的方向参考,跟着方向逐一测试, 期间也可以巩固基础。
VSole
网络安全专家