Web安全之手动Sql注入

SQL注入

 SQL注入,旁注,XSS跨站,COOKIE欺骗,DDOS,0day 漏洞,社会工程学 等等等等,只要有数据交互,就会存在被入侵风险!哪怕你把网线拔掉,物理隔绝,我还可以利用传感器捕捉电磁辐射信号转换成模拟图像。你把门锁上,我就爬窗户;你把窗户关上,我就翻院墙;你把院墙加高,我就挖地洞。。。道高一尺魔高一丈,我始终坚信计算机不存在绝对的安全,你攻我防,此消彼长,有时候,魔与道只在一念之间。
    下面,就让我们一起推开计算机中那另一扇不为人知的门---

sql注入工具sqlmap

http://sqlmap.org/

   (一)了解注入原理
    为什么会存在sql注入呢,只能说SQL出身不好。因为sql作为一种解释型语言,在运行时是由一个运行时组件解释语言代码并执行其中包含的指令的语言。基于这种执行方式,产生了一系列叫做代码注入(code injection)的漏洞 。它的数据其实是由程序员编写的代码和用户提交的数据共同组成的。程序员在web开发时,没有过滤敏感字符,绑定变量,导致攻击者可以通过sql灵活多变的语法,构造精心巧妙的语句,不择手段,达成目的,或者通过系统报错,返回对自己有用的信息。
    我们在学JDBC和SQL时,讲师跟我们说 Statement不能防止SQL注入, PreparedStatement能够防止SQL注入. 没错, 这句话是没有问题的, 但到底如何进行SQL注入?怎么直观的去了解SQL注入?这还是需要花一定的时间去实验的.预编译语句java.sql.PreparedStatement ,扩展自 Statement,不但具有 Statement 的所有能力而且具有更强大的功能。不同的是,PreparedStatement 是在创建语句对象的同时给出要执行的sql语句。这样,sql语句就会被系统进行预编译,执行的速度会有所增加,尤其是在执行大语句的时候,效果更加理想。而且PreparedStatement中绑定的sql语句是可以带参数的。

下面是一个项目的实例:

以下更改已应用到原始请求:
已将参数“->"companyId"”的值设置为“5a3a363f972702ad45c9402b%27%3B

推理:
测试结果似乎指示存在脆弱性,因为响应包含 SQL Server 错误。这表明测试设法通过注入危险字符穿透了应用程序并到达 SQL 查询本身

1.准备漏洞web系统,fiddler或其他可以拦截http请求的工具

2.登录系统,打开fiddler确保可以正常抓包

3.将抓到的网站请求拖到Composer里

4.修改并执行此请求(如在公司id后添加{"companyId":"5a3a363f972702ad45c9402b';","name":)

 

原来的正常请求:

 Sql注入的结果:

 

 另一篇SQL注入,是可以获取用户数据的。

https://www.cnblogs.com/pursuitofacm/p/6706961.html

--------------------------------------------

  SQL盲注

首先来简单介绍一下盲注,盲注是不能通过直接显示的途径来获取数据库数据的方法。在盲注中,攻击者根据其返回页面的不同来判断信息(可能是页面内容的不同,也可以是响应时间不同)。一般情况下,盲注可分为三类。

Booleanbase
Timebase
Errorbase

其中第一类Boolean就是我们最常接触到的普通盲注。

比如在where语句中可以构造or 1=1来使返回页面不同。(这里用mysql演示一下,大家体会就好)

mysql> select 123 from dual where 1=1;
+-----+
| 123 |
+-----+
| 123 |
+-----+
1 row in set (0.00 sec)
mysql> select 123 from dual where 1=0;
Empty set (0.00 sec)

如果注入点在order by后面,那么则可以使用判断语句来构造报错。(其实order by后面的注入也可以根据返回结果的顺序来判断,这里自由发挥就好:P)

mysql> select 1 from te order by if(1,1,(select 1 union select 2)) limit 0,3;
+---+
| 1 |
+---+
| 1 |
| 1 |
| 1 |
+---+
3 rows in set (0.00 sec)
mysql> select 1 from te order by if(0,1,(select 1 union select 2)) limit 0,3;
ERROR 1242 (21000): Subquery returns more than 1 row

基于时间的盲注的话,mysql主要涉及两个函数,sleep banchmark 基本是使用如下。

mysql> select 1 from te where if(1=1,sleep(1),1) limit 0,1;
Empty set (27.00 sec)
mysql> select 1 from te where if(1=2,sleep(1),1) limit 0,1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)

实例:

 

---------------------

盲注的响应:

 

 

描述: SQL 盲注:字符串并置(MS-SQL 变体)

差异:
以下更改已应用到原始请求:
已将参数“sortProp”的值设置为“%27+%2B+%27%27+%2B+%27lastUpdate”
已将参数“sortProp”的值设置为“%27+%2B+%27+%2B+%27lastUpdate”
已将参数“sortProp”的值设置为“lastUpdate%27+%2B+%27+%2B+%27”
已将参数“sortProp”的值设置为“lastUpdate%27+%2B+%27%27+%2B+%27”

推理:
测试结果似乎指示存在漏洞,因为它显示可以在参数值后附加的值,这表明它们嵌入在 SQL 查询中。在该测试中,有 3(有时为 4)个请求已发送。最后一个请求在逻辑上等同于原始请求,而倒数第二个请求则不同。所有其他请求都是为了实现控制目的。最后两个响应与第一个响应的比较(最后一个响应与第一个响应类似,倒数第二个响应则不同)指示应用程序易受攻击。

 

posted @ 2018-10-26 15:30  白灰  阅读(2653)  评论(0)    收藏  举报