1.注入的分类
基于从服务器收到的响应
一阶注射是指输入的注射语句对WEB直接产生了影响,出现了结果;二阶注入类似存储型XSS,是指输入提交的语句,无法直接对WEB应用程序产生影响,通过其他的辅助间接的对WEB产生危害,这样的就被称为是二阶注入。
基于注入点的位置上的
- 通过用户输入的表单域的注射
- 通过cookie的注射
-
2.系统函数
几个常用的函数:
version() —— MySQL版本
- user() —— 数据库用户名
- database() —— 数据库名
- @@datadir —— 数据库路径
@@version_compile_os —— 操作系统版本
3.字符串连接函数
concat(str1,str2,……) —— 没有分隔符的字符串拼接
- concat_ws(separator,str1,str2,……) —— 含有分隔符的连接字符串
- group_concat(str1,str2,……) —— 连接一个组的所有字符串,并以逗号分割每一条数据
4.一般用于尝试的语句
PS:—+ 可以用 # 替换,url 提交过程中 Url 编码后的 # 为 %23
or 1=1—+
‘ or 1=1—+
“ or 1=1—+
) or 1=1—+
‘) or 1=1—+
“) or 1=1—+
“)) or 1=1—+
一般的代码为:
$id=$_GET[‘id’];
$sql=”SELECT * FROM users WHERE id=’$id’ LIMIT 0,1”;
此处考虑两点,一是闭合前面的 ‘ 另一个是处理后面的 ‘ ,一般采用两种思路,闭合后面的引号或者注释掉,注释掉采用 —+ 或者 #5.union 操作符的介绍
UNION 操作符用户合并两个或多个 SELECT 语句的结果集。UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列必须顺序相同。SQL UNION 语法
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL 。SQL UNION ALL 语法
SELECT columns_name(s) FROM table_name1
UNION ALL
SELECT columns_name(s) FROM table_name2
另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。6.sql中的逻辑运算
问题:select from users where id = 1 and 1 = 1; 这条语句为什么能够选择出 id=1 的内容,and 1=1 到底起作用了没有?这里就要清楚sql语句的执行顺序了
同时这个问题我们在使用万能密码的时候会用到。
`select from admin where username = ‘admin’ and password = ‘admin’;<br />我们可以用 'or 1=1# 作为密码输入。原因是为什么? <br />这里涉及到一个逻辑运算,当使用上述所谓的万能密码后,构成的sql 语句为: <br />select from admin where username = ‘admin’ and password = ‘’ or 1 = 1 #;<br />Explain:上面的这个语句执行后,我们在不知道密码的情况下就登录到了admin 用户了。 <br />原因是在where 子句后, 我们可以看到三个条件语句username = ‘admin’ and password = ‘’ or 1 = 1。三个条件用and 和or 进行连接。在sql 中,我们and 的运算优先 级大于or 的元算优先级。因此可以看到第一个条件(用a 表示)是真的,第二个条件(用 b 表示)是假的,a and b = false,第一个条件和第二个条件执行and 后是假,再与第三 个条件or 运算,因为第三个条件1=1是恒成立的,所以结果自然就为真了。因此上述的语 句就是恒真了。<br /><br />①select from users where id = 1 and 1 = 1;<br />②select from users where id = 1 && 1 = 1;<br />③select from users where id = 1 & 1 = 1; `
上述三者有什么区别?① 和 ② 是一样的,表达的意思是 id=1 条件和 1=1 条件进行与运算。
③ 的意思是 id = 1 条件与 1 进行 & 位操作,id =1 被当作 true,与 1 进行 & 运算结果还是 1, 再进行 = 操作,1 = 1,还是 1(ps:& 的优先级大于 = )
Ps : 此处进行的位运算。我们可以将数转换为二进制再进行与、或、非、异或等运算。必要 的时候可以利用该方法进行注入结果。例如将某一字符转换为ascii 码后,可以分别与 1,2,4,8,16,32.。。。进行与运算,可以得到每一位的值,拼接起来就是 ascii 码值。再从 ascii 值反推回字符。(运用较少)7.注入流程
