SQL注入流程:
1. 是否存在注入并且判断注入类型
2. 判断字段数 order by
3. 确定回显点 union select 1,2
4. 查询数据库信息 @@version @@datadir
5. 查询用户名,数据库名 user() database()
6. 文件读取 union select 1,load_file('C:\\wondows\\win.ini')#
7. 写入 webshell select..into outfile...
使用sql注入遇到转义字符串的单引号或者双引号,可使用HEX编码绕过
sql注入干货:请看这里!
SQL注入
题目:
题解:
1. 是否存在注入并且判断注入类型
那就先输入1:
再输入两位数11,
有点变化!!
作为一名ctf小白,对于sql注入题没有一点儿经验,之后看别人写的题解,原来这叫**回显**
,回显是指将用户输入的内容原样返回给用户的操作,或者将程序的执行结果输出到屏幕上。有回显,存在注入点,学到了!!!
试了n久,思路不对,下面的思路就是借鉴了别人的了
2. 判断字段数
看看存在几行数据,分别用order by 1,order by 2,order by 3···试试
3. 确定回显点
到order by 3开始就没有回显了,所以字段数为2
**我有个问题:为什么判断回显,就可以判断字段数呢?**
于是开始查资料:
回显可以判断字段数的原因在于,当我们在网页或应用程序中填写表单时,输入的数据会被临时存储在服务器端,以便在需要时进行验证或处理。在回显过程中,服务器会将已填写的数据发送回客户端,以便用户在下次访问时能够看到他们之前输入的信息。
通过检查回显数据中的字段数量,我们可以确定表单中有多少个字段被填充了数据。这是因为每个字段在回显数据中都会占据一定的位置,并且可以通过特定的标识符或索引来识别和计数。
例如,在一个包含姓名、电子邮件地址和电话号码字段的表单中,如果回显数据包含了这三个字段的值,那么我们可以确定该表单共有三个字段。同样地,如果回显数据中只包含姓名和电子邮件地址字段的值,那么我们可以确定该表单共有两个字段。
4. 联合查询:
要先将联合查询之前的值设为一个不存在的,一般给-1。
老师,我又有问题【举手】:为什么联合查询前要设一个不存在的值?
原因是:当使用Union操作符连接两个查询结果集时,如果第一个查询结果集为空(即没有匹配的行),则第二个查询结果集将作为最终的结果集返回。
那又有问题了,为什么不直接使用后者,不用union呢
?
我理解是,查询的条件不止一个,而查询的结果只有一个,直接用后者的话,语法不对,不能这么写,只能用连接操作union联合查询,但为了保证结果是目标查询语句得出的,就需要让第一个结果为不存在(为空)【如果您觉得我理解不对的话,请评论区告诉我哦】
先爆库:database()
-1 union select 1,database()
出现一个数据库名sqli
接着爆表:tables
-1 union select 1, group_concat(table_name) from information_schema.tables where table_schema='sqli'
这里爆出了flag和news两个表,
然后爆列:column
-1 union select 1, group_concat(column_name) from information_schema.columns where table_name='flag'
最后爆字段:
-1 union select 1, union select 1, group_concat(flag) from sqil.flag
拿到flag
如果你觉得文章内容有误,请评论区指出,谢谢~