sql盲注(medium):
前端是下拉表单,没法输入,只能抓包看看
随便提交一个参数可以看到是存在的,修改参数看看
先猜测数据库长度,很明显数据库长度<=5,经过一系列尝试,知道数据库长度是4
之后步骤与low级别一样
(省略一系列步骤)猜解数据库库名,首字母是d………………用相同办法,得出库名为dvwa
(省略尝试步骤) 猜解表个数
猜解表名(表长度+组成字符)
and length(substr((select table_name from information_schema.tables where table_schema=database() limit0,1),1))=数字 //表长度
and ascii (substr((select table_name from information_schema.tables where table_schema=database() limit0,1),1,1))=数字[ascii码] //表的组成字符[1,1是第一个表的第一个字符]
表名破解后就猜解表中列名(相应表中列个数——>第n列列名长度——>列名的组成字符)
查看对应列内容
因为和low一样,步骤繁杂,大致思路就是这样
xss(reflected)low:反射性跨站脚本攻击
【跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。】
1.反射型XSS:攻击者事先制作好攻击链接, 需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面,xss漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的,所以xss漏洞关键就是寻找参数未过滤的输出函数。
2.常见的输出函数有: echo printf print print_r sprintf die var-dump var_export
3.array_key_exists() 函数检查某个数组中是否存在指定的键名,如果键名存在则返回 true,如果键名不存在则返回 false。用法array_key_exists(key,array) ,如果指定数组的时候省略了键名,将会生成从 0 开始并以 1 递增的整数键名。
4.弹窗警告:
<script>alert('XSS')</script>
<script>alert(document.cookie)</script>
这里判断了是否存在GET传进去的name[键名],且过滤了键内容为空的情况,设置弹窗警告验证了xss的存在,表明注入代码成功
eg:
xss(reflected)lmedium:
1.str.replace(old, new,[max]):有三个参数,old是需要替换的值,new是替换后的值,max是最多替换的次数 ,该函数区分大小写,将script部分或者全部大写即可绕过
这里第三行代码因该是把传进去的name中的所有<script>标签全部变为空
xss(reflected)high:
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
1)$pattern: 要搜索的模式,可以是字符串或一个字符串数组。
$replacement: 用于替换的字符串或字符串数组。
$subject: 要搜索替换的目标字符串或字符串数组。
$limit: 可选,对于每个模式用于每个 subject 字符串的最大可替换次数。 默认是-1(无限制)。
$count: 可选,为替换执行的次数。
2).表示除\n之外的任意字符
*表示匹配0-无穷
* 匹配0或多个正好在它之前的那个字符。例如正则表达式。*意味着能够匹配任意数量的任何字符。? 匹配0或1个正好在它之前的那个字符。.*是指任何字符0个或多个,.?是指任何字符0个或1个.
.*具有贪婪的性质,首先匹配到不能匹配为止,根据后面的正则表达式,会进行回溯。.*?则相反,一个匹配以后,就往下进行,所以不会进行回溯,具有最小匹配的性质。
?表示非贪婪模式,即为匹配最近字符 如果不加?就是贪婪模式a.*bc 可以匹配 abcbcbc
正则表达式a* 可以匹配 a aa aaa aaaa aaaaaaa (ab)* 可以匹配 ab abababab ababababababab等等
需要注意的是,*与+不同,+要求重复数量至少为1,*则可以为0,所以字符串为空也是可以匹配的
即在这里过滤了script标签里的字符,不管字符重复次数,/i为不管大小写,所以,不妨换一个标签试试
img:告诉浏览器需要显示一张图片
src:指定图片的url
onerror:指定加载图片时如果出现错误则要执行的事件【url肯定不正确,弹窗肯定会执行】
xss(stored)low:储存型跨站脚本攻击
1.存储型跨站脚本攻击:会把用户输入的数据存储在服务器端。应用程序直接将攻击者提交的具有恶意代码存储到后台,在显示数据页面被访问时恶意脚本在浏览器因 html 注入导致页面执行恶意代码从而被攻击者控制浏览器就会发生储存式跨站点脚本。
2.trim(string):Trim是String型数据的一个方法,作用是去掉字符串开头和结尾的空格【即a=空格a空格】和预定义字符【\t \n \x0B \r】
striplashes(string):删除字符串中的反斜杠
mysql_real_scape_string():转义字符串中的特殊符号【\n \r \ ' "等等】
mysql_qurry():执行一条mysql查询
好像并没有对输出做出什么过滤,就可以直接执行一个弹窗看看能否执行成功,有弹窗说明注入成功
xss(stored)medium:
1)strip_tags:strip_tags() 函数剥去字符串中的 HTML、XML 以及 PHP 的标签,并且始终会剥离HTML中的注释,函数将返回剥离后的字符串。
2)addlashes(string):在预定义字符串前添加反斜杠
3)htmlspecialchars():把一些预定义的字符转换为 HTML 实体
& (和号) 成为 &
" (双引号) 成为 "
' (单引号) 成为 '
< (小于) 成为 <
> (大于) 成为 >
html实体:在 HTML 中不能使用小于号(<)和大于号(>),这是因为浏览器会误认为它们是标签。如果希望正确地显示预留字符,我们必须在 HTML 源代码中使用字符实体,但是浏览器也许并不支持所有实体名称(对实体数字的支持却很好)。
htmlspecialchars()此函数使无法输入标签<>,就感觉很麻烦,name就只是将<script>标签转化为空和转义一些特殊字符,可以用双写绕过和大小写绕过
在输入的时候发现name那里输入10个字符后就不能再输入了,抓包看看,看能不能修改name参数