#学习笔记#SQL注入及DVWA之php+mysql手工注入实验

手工注入
sql注入一些理论
1、理解万能密码使用 aps+access数据注入
2、php+mysql环境sql注入(流行)

静态网页:html或者htm,不需要服务器解析其中脚本。
不依赖数据库;灵活性差、制作、更新、维护麻烦;交互性较差

哪些地方存在注入漏洞?
参数名:id=36 pass=‘aaa’ 参数值 cookie 目录名 文件名 ……
最普遍的注入漏洞是由于参数值过滤不严导致的。
Cookie注入漏洞普遍存在于ASP的程序中。
参数名、目录名、文件名等注入漏洞通常存在于有网站路由的程序中。

常用WEB漏洞扫描工具
啊D注入工具 V2.32 WebCruiser 2.61 AcunetixWVS 8.0 Netsparker 2.5.3.0

判断注入漏洞的依据
根据客户端返回的结果来判断提交的测试语句是否成功被数据库引擎执行,如果测试语句被执行了,说明存在注入漏洞。
构造测试语句→提交请求→分析返回结果→符合预期效果→存在SQL注入漏洞
→不符合预期结果→构造……或不存在
分类:
按数据类型 数字型 字符型
按返回值 显错注入 盲注

内联SQL注入:注入一段SQL语句后,原来的语句仍会全部执行。
#学习笔记#SQL注入及DVWA之php+mysql手工注入实验_第1张图片
#学习笔记#SQL注入及DVWA之php+mysql手工注入实验_第2张图片
终止式SQL注入
攻击者注入一段包含注释负的SQL语句,将原来的语句的一部分注释,注释掉的部分语句不会被执行。
#学习笔记#SQL注入及DVWA之php+mysql手工注入实验_第3张图片
Xor 异或
不等的则是真,即比较的两个值不相同的就对,相同的就错,几乎没有过滤参数,可以用经典‘or’=‘or’进去的,‘xor’都可以进去。
1’xor’1’=’1
‘xor’1’=’1
‘xor’a’=’a
1’ xor’1’=’1
1’xor’1’=’1

实验链接:http://www.shiyanbar.com/experiment-course/experiment-course/vid/2087
DVMA是一个渗透测试演练系统,模仿了很多的渗透测试的漏洞
实验步骤:
一、低安全等级文件包含
1.1打开网页,输入用户名admin密码password登录
1.2登录需要将DVMA的安全级别调整为low。调整后选择SQL Injection,进入页面。
1.3提示输入User ID,输入正确的ID,将显示ID First name,Surname信息。
#学习笔记#SQL注入及DVWA之php+mysql手工注入实验_第4张图片
1.4可以得知此处为注入点,尝试输入“’ ”,返回错误。
1.5初步判断此处为数字类型的注入,尝试输入 and 1=1,发现不可,尝试1 or 1=1,尝试遍历数据库表
1.6尝试输入1 or 1=1,想要遍历数据库表,并没有达到目的,猜测程序将此处看成了字符型,可以尝试输入:1’ or ‘1’ =’ 1后遍历出了数据库中的所有内容。下面尝试结合各种不同语句,得到不同的结果。
1.7利用order by num语句来测试查询信息列表,修改num的值,这里我们输入“ 1’ order by 1 - - ”结果页面正常显示,注意- -后面有空格。继续测试“ 1’ order by 2 - - ”“ 1’ order by 3 - - ”,当输入是3时,页面报错。
order by是将语句进行排序。
页面错误信息如下,Unknown column ‘3’ in ‘order clause’ ,由此我们判断查询结果值为2列。
1.8通过使用user(),database(),version()三个内置函数得到连接数据库的账户名、数据库名称,数据版本信息,首先参数注入:1’ and 1=2 union select 1,2 – 。(注意—后又一个空格)
#学习笔记#SQL注入及DVWA之php+mysql手工注入实验_第5张图片
由上图得知,从而得出First name处显示结果为查询结果第一列的值,surname处显示结果为查询结果第二列的值。
1.9在得知显示之后,使用user(),database(),version()三个内置函数得到连接数据库的账户名、数据库名称、数据库版本信息。通过注入:1’ and 1=2 union select user(),database() - - (注意- 后有空格)
得到数据库用户以及数据库名称。连接数据库的用户为root@localhost,数据库名称为dvwa
1.10通过注入 1’ and 1=2 union select version(),database() – 得到数据库版本信息,此处数据库版本为:5.0.90-community-nt。
1.11通过注入1’ and 1=2 union select 1,@@global.version_complie_os from mysql.user - 获得操作系统信息
1.12通过注入 1’ and 1=2 union select 1,schema_name from information
_schame.schemata– (注意-后有空格)。查询mysql数据库,所有数据库名字:这里利用mysql默认的数据库information_schema,该数据库存储了mysql所有数据库和表的信息。
1.13通过注入:1’ and exists( select from users )– 猜解dvwa数据库中的表名。利用1 ’ and exists(select * from表名),这里测试的结果,表名为
users ,在真实渗透测试环境中,攻击者往往关心存储管理员用户与密码信息的表。
1.14猜解字段名:1’ and exists( select 表名 from users ) – ,这里测试的字名、有first_name,last_name使用:1’ and exists( select first name from users 和1 ’ and exists(select last name from users)- 猜解字段名。
1.15爆出数据库中字段的内容1’ and 1= 2 union select first_ name,last_name from users – ,这里其实如果是存放管理员账户的表,那么用户名,密码信息字段就可以爆出来了。
1.16同15
1.17查看low等级源代码
#学习笔记#SQL注入及DVWA之php+mysql手工注入实验_第6张图片
通过代码可以看出,对输入$id的值没有进行任何过滤就直接放入了SQL语句中进行处理,这样带来了极大的隐患。
二、中等等级代码分析
2.1将DVWA安全级别调整为medium,查看源代码。
#学习笔记#SQL注入及DVWA之php+mysql手工注入实验_第7张图片
通过源代码可以看出,在中等级别时对输入的 id使mysqlrealeascapestring()PHP,使mysqlrealeascapestring(SQL使使使ur|SQLWHEREuserid= i d 的 值 使 用 m y s q l r e a l e a s c a p e s t r i n g ( ) 函 数 进 行 了 处 理 。 在 P H P 中 , 使 用 m y s q l r e a l e a s c a p e s t r i n g ( 函 数 用 来 转 义 S Q L 语 句 中 使 用 字 符 串 的 特 殊 字 符 。 但 是 使 用 这 个 函 数 对 参 数 进 行 转 换 是 存 在 绕 过 的 。 只 需 要 将 攻 击 字 符 进 行 转 换 一 下 编 码 格 式 即 可 绕 过 该 防 护 函 数 。 比 如 使 用 u r | 编 码 等 方 式 。 同 时 发 现 S Q L 语 句 中 变 成 了 ” W H E R E u s e r i d = id”, 此处变成了数字型注入,所以此处使用mysql real escape string()函数并没有起到防护的作用。可以通过类似于”1 or 1= 1” 的语句来进行注入。
三、高等级代码分析
3.1将DVWA安全级别调整为medium,查看源代码。
#学习笔记#SQL注入及DVWA之php+mysql手工注入实验_第8张图片
从源代码中可以看出,此处认为字符型注入。对传入 id使stripslashes() i d 的 值 使 用 s t r i p s l a s h e s ( ) 函 数 处 理 以 后 , 在 经 过 到 mysql real escape string(函数进行第二次过滤。 在默认情况下,PHP会对所有的GET,POST,,和cookie数据自动运行addslashes(),adslashers()函数返回在部分与定义之前添加反斜杠。就是将“ 变成”\’”, Stripslashes(函数则是删除由addslashes()函数添加的反斜杠。
在使用两个函数进行过滤之后再使用is_ numric()函数检查$id的值是否为数字,彻底断绝了注入的存在。此种防护不存在绕过的可能。

你可能感兴趣的:(学习笔记)